diff options
Diffstat (limited to 'doc/web/howto/web-in-60/dynamic-content.html')
-rw-r--r-- | doc/web/howto/web-in-60/dynamic-content.html | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/doc/web/howto/web-in-60/dynamic-content.html b/doc/web/howto/web-in-60/dynamic-content.html new file mode 100644 index 0000000..c099039 --- /dev/null +++ b/doc/web/howto/web-in-60/dynamic-content.html @@ -0,0 +1,124 @@ +<?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: Generating a Page Dynamically</title> +<link href="../stylesheet.css" rel="stylesheet" type="text/css"/> + </head> + + <body bgcolor="white"> + <h1 class="title">Generating a Page Dynamically</h1> + <div class="toc"><ol/></div> + <div class="content"> +<span/> + +<p>The goal of this example is to show you how to dynamically generate the +contents of a page.</p> + +<p>Taking care of some of the necessary imports first, we'll 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> and the <code class="API"><a href="http://twistedmatrix.com/documents/12.1.0/api/twisted.internet.reactor.html" title="twisted.internet.reactor">reactor</a></code>:</p> + +<pre class="python"><p class="py-linenumber">1 +2 +</p><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">server</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">Site</span> +</pre> + +<p>The Site is a factory which associates a listening port with the HTTP +protocol implementation. The reactor is the main loop that drives any Twisted +application; we'll use it to actually create the listening port in a moment.</p> + +<p>Next, we'll import one more thing from Twisted +Web: <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>. An +instance of <code>Resource</code> (or a subclass) represents a page +(technically, the entity addressed by a URI).</p> + +<pre class="python"><p class="py-linenumber">1 +</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">resource</span> <span class="py-src-keyword">import</span> <span class="py-src-variable">Resource</span> +</pre> + +<p>Since we're going to make the demo resource a clock, we'll also import the +time module:</p> + +<pre class="python"><p class="py-linenumber">1 +</p><span class="py-src-keyword">import</span> <span class="py-src-variable">time</span> +</pre> + +<p>With imports taken care of, the next step is to define +a <code>Resource</code> subclass which has the dynamic rendering +behavior we want. Here's a resource which generates a page giving the +time:</p> + +<pre class="python"><p class="py-linenumber">1 +2 +3 +4 +</p><span class="py-src-keyword">class</span> <span class="py-src-identifier">ClockPage</span>(<span class="py-src-parameter">Resource</span>): + <span class="py-src-variable">isLeaf</span> = <span class="py-src-variable">True</span> + <span class="py-src-keyword">def</span> <span class="py-src-identifier">render_GET</span>(<span class="py-src-parameter">self</span>, <span class="py-src-parameter">request</span>): + <span class="py-src-keyword">return</span> <span class="py-src-string">"<html><body>%s</body></html>"</span> % (<span class="py-src-variable">time</span>.<span class="py-src-variable">ctime</span>(),) +</pre> + +<p>Setting <code>isLeaf</code> to <code>True</code> indicates +that <code>ClockPage</code> resources will never have any +children.</p> + +<p>The <code>render_GET</code> method here will be called whenever the URI we +hook this resource up to is requested with the <code>GET</code> method. The byte +string it returns is what will be sent to the browser.</p> + +<p>With the resource defined, we can create a <code>Site</code> from it:</p> + +<pre class="python"><p class="py-linenumber">1 +2 +</p><span class="py-src-variable">resource</span> = <span class="py-src-variable">ClockPage</span>() +<span class="py-src-variable">factory</span> = <span class="py-src-variable">Site</span>(<span class="py-src-variable">resource</span>) +</pre> + +<p>Just as with the previous static content example, this +configuration puts our resource at the very top of the URI hierarchy, +ie at <code>/</code>. With that <code>Site</code> instance, we can +tell the reactor to <a href="../../../core/howto/servers.html" shape="rect">create +a TCP server</a> and start servicing requests:</p> + +<pre class="python"><p class="py-linenumber">1 +2 +</p><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>Here's the code with no interruptions:</p> + +<pre class="python"><p class="py-linenumber"> 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +10 +11 +12 +13 +14 +</p><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">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">import</span> <span class="py-src-variable">time</span> + +<span class="py-src-keyword">class</span> <span class="py-src-identifier">ClockPage</span>(<span class="py-src-parameter">Resource</span>): + <span class="py-src-variable">isLeaf</span> = <span class="py-src-variable">True</span> + <span class="py-src-keyword">def</span> <span class="py-src-identifier">render_GET</span>(<span class="py-src-parameter">self</span>, <span class="py-src-parameter">request</span>): + <span class="py-src-keyword">return</span> <span class="py-src-string">"<html><body>%s</body></html>"</span> % (<span class="py-src-variable">time</span>.<span class="py-src-variable">ctime</span>(),) + +<span class="py-src-variable">resource</span> = <span class="py-src-variable">ClockPage</span>() +<span class="py-src-variable">factory</span> = <span class="py-src-variable">Site</span>(<span class="py-src-variable">resource</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 |