diff options
Diffstat (limited to 'doc/web/howto/web-in-60/static-dispatch.html')
-rw-r--r-- | doc/web/howto/web-in-60/static-dispatch.html | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/doc/web/howto/web-in-60/static-dispatch.html b/doc/web/howto/web-in-60/static-dispatch.html new file mode 100644 index 0000000..3084ce1 --- /dev/null +++ b/doc/web/howto/web-in-60/static-dispatch.html @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> + <head> +<title>Twisted Documentation: Static URL Dispatch</title> +<link href="../stylesheet.css" rel="stylesheet" type="text/css"/> + </head> + + <body bgcolor="white"> + <h1 class="title">Static URL Dispatch</h1> + <div class="toc"><ol/></div> + <div class="content"> +<span/> + +<p>The goal of this example is to show you how to serve different content at +different URLs.</p> + +<p>The key to understanding how different URLs are handled with the resource +APIs in Twisted Web is understanding that any URL can be used to address a node +in a tree. Resources in Twisted Web exist in such a tree, and a request for a +URL will be responded to by the resource which that URL addresses. The +addressing scheme considers only the path segments of the URL. Starting with the +root resource (the one used to construct the <code>Site</code>) and the first +path segment, a child resource is looked up. As long as there are more path +segments, this process is repeated using the result of the previous lookup and +the next path segment. For example, to handle a request +for <code>"/foo/bar"</code>, first the root's <code>"foo"</code> child is +retrieved, then that resource's <code>"bar"</code> child is retrieved, then that +resource is used to create the response.</p> + +<p>With that out of the way, let's consider an example that can serve a few +different resources at a few different URLs.</p> + +<p>First things first: we need to import <code class="API"><a href="http://twistedmatrix.com/documents/12.1.0/api/twisted.web.server.Site.html" title="twisted.web.server.Site">Site</a></code>, the factory for HTTP servers, <code class="API"><a href="http://twistedmatrix.com/documents/12.1.0/api/twisted.web.resource.Resource.html" title="twisted.web.resource.Resource">Resource</a></code>, a convenient base class +for custom pages, and <code class="API"><a href="http://twistedmatrix.com/documents/12.1.0/api/twisted.internet.reactor.html" title="twisted.internet.reactor">reactor</a></code>, +the object which implements the Twisted main loop. We'll also import <code class="API"><a href="http://twistedmatrix.com/documents/12.1.0/api/twisted.web.static.File.html" title="twisted.web.static.File">File</a></code> to use as the resource at one +of the example URLs.</p> + +<pre class="python"><p class="py-linenumber">1 +2 +3 +4 +</p><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">web</span>.<span class="py-src-variable">server</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">Site</span> +<span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">web</span>.<span class="py-src-variable">resource</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">Resource</span> +<span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">internet</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">reactor</span> +<span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">web</span>.<span class="py-src-variable">static</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">File</span> +</pre> + +<p>Now we create a resource which will correspond to the root of the URL +hierarchy: all URLs are children of this resource.</p> + +<pre class="python"><p class="py-linenumber">1 +</p><span class="py-src-variable">root</span> = <span class="py-src-variable">Resource</span>() +</pre> + +<p>Here comes the interesting part of this example. We're now going to +create three more resources and attach them to the three +URLs <code>/foo</code>, <code>/bar</code>, and <code>/baz</code>:</p> + +<pre class="python"><p class="py-linenumber">1 +2 +3 +</p><span class="py-src-variable">root</span>.<span class="py-src-variable">putChild</span>(<span class="py-src-string">"foo"</span>, <span class="py-src-variable">File</span>(<span class="py-src-string">"/tmp"</span>)) +<span class="py-src-variable">root</span>.<span class="py-src-variable">putChild</span>(<span class="py-src-string">"bar"</span>, <span class="py-src-variable">File</span>(<span class="py-src-string">"/lost+found"</span>)) +<span class="py-src-variable">root</span>.<span class="py-src-variable">putChild</span>(<span class="py-src-string">"baz"</span>, <span class="py-src-variable">File</span>(<span class="py-src-string">"/opt"</span>)) +</pre> + +<p>Last, all that's required is to create a <code>Site</code> with the root +resource, associate it with a listening server port, and start the reactor:</p> + +<pre class="python"><p class="py-linenumber">1 +2 +3 +</p><span class="py-src-variable">factory</span> = <span class="py-src-variable">Site</span>(<span class="py-src-variable">root</span>) +<span class="py-src-variable">reactor</span>.<span class="py-src-variable">listenTCP</span>(<span class="py-src-number">8880</span>, <span class="py-src-variable">factory</span>) +<span class="py-src-variable">reactor</span>.<span class="py-src-variable">run</span>() +</pre> + +<p>With this server running, <code>http://localhost:8880/foo</code> +will serve a listing of files +from <code>/tmp</code>, <code>http://localhost:8880/bar</code> will +serve a listing of files from <code>/lost+found</code>, +and <code>http://localhost:8880/baz</code> will serve a listing of +files from <code>/opt</code>.</p> + +<p>Here's the whole example uninterrupted:</p> + +<pre class="python"><p class="py-linenumber"> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +</p><span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">web</span>.<span class="py-src-variable">server</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">Site</span> +<span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">web</span>.<span class="py-src-variable">resource</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">Resource</span> +<span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">internet</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">reactor</span> +<span class="py-src-keyword">from</span> <span class="py-src-variable">twisted</span>.<span class="py-src-variable">web</span>.<span class="py-src-variable">static</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">File</span> + +<span class="py-src-variable">root</span> = <span class="py-src-variable">Resource</span>() +<span class="py-src-variable">root</span>.<span class="py-src-variable">putChild</span>(<span class="py-src-string">"foo"</span>, <span class="py-src-variable">File</span>(<span class="py-src-string">"/tmp"</span>)) +<span class="py-src-variable">root</span>.<span class="py-src-variable">putChild</span>(<span class="py-src-string">"bar"</span>, <span class="py-src-variable">File</span>(<span class="py-src-string">"/lost+found"</span>)) +<span class="py-src-variable">root</span>.<span class="py-src-variable">putChild</span>(<span class="py-src-string">"baz"</span>, <span class="py-src-variable">File</span>(<span class="py-src-string">"/opt"</span>)) + +<span class="py-src-variable">factory</span> = <span class="py-src-variable">Site</span>(<span class="py-src-variable">root</span>) +<span class="py-src-variable">reactor</span>.<span class="py-src-variable">listenTCP</span>(<span class="py-src-number">8880</span>, <span class="py-src-variable">factory</span>) +<span class="py-src-variable">reactor</span>.<span class="py-src-variable">run</span>() +</pre> + +</div> + + <p><a href="../index.html">Index</a></p> + <span class="version">Version: 12.1.0</span> + </body> +</html>
\ No newline at end of file |