-
Notifications
You must be signed in to change notification settings - Fork 0
/
usage.html
366 lines (354 loc) · 25.3 KB
/
usage.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Let’s do it! (aka Quickstart) — pyroutes v0.4.1 documentation</title>
<link rel="stylesheet" href="static/pyroutes.css" type="text/css" />
<link rel="stylesheet" href="static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '0.4.1',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="static/jquery.js"></script>
<script type="text/javascript" src="static/underscore.js"></script>
<script type="text/javascript" src="static/doctools.js"></script>
<link rel="top" title="pyroutes v0.4.1 documentation" href="index.html" />
<link rel="next" title="Deployment" href="deployment.html" />
<link rel="prev" title="Installation" href="installation.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="deployment.html" title="Deployment"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="installation.html" title="Installation"
accesskey="P">previous</a> |</li>
<li><a href="index.html">pyroutes v0.4.1 documentation</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="let-s-do-it-aka-quickstart">
<h1>Let’s do it! (aka Quickstart)<a class="headerlink" href="#let-s-do-it-aka-quickstart" title="Permalink to this headline">¶</a></h1>
<div class="section" id="application-entry-point">
<h2>Application entry point<a class="headerlink" href="#application-entry-point" title="Permalink to this headline">¶</a></h2>
<p>The application entry point is located directly in the <tt class="docutils literal"><span class="pre">pyroutes</span></tt> module.
Just do</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">pyroutes</span> <span class="kn">import</span> <span class="n">application</span>
</pre></div>
</div>
<p>in the file you want as a handler for <tt class="docutils literal"><span class="pre">mod_wsgi</span></tt> or your preferred deployment method.
Let’s call it <tt class="docutils literal"><span class="pre">handler.py</span></tt> for now.</p>
</div>
<div class="section" id="adding-routes">
<h2>Adding routes<a class="headerlink" href="#adding-routes" title="Permalink to this headline">¶</a></h2>
<p>Routes are the way for defining which methods should handle requests to which paths.</p>
<p>This is the most basic example:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">pyroutes</span> <span class="kn">import</span> <span class="n">route</span>
<span class="kn">from</span> <span class="nn">pyroutes.http.response</span> <span class="kn">import</span> <span class="n">Response</span>
<span class="nd">@route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="s">'Hello world!'</span><span class="p">)</span>
</pre></div>
</div>
<p>Here we define that our index method should handle all requests to <tt class="docutils literal"><span class="pre">/</span></tt>, and
return the world famous «Hello world!» to the user.</p>
<p>We can add more routes:</p>
<div class="highlight-python"><pre>@route('/sayhello')
def sayhello(request, name='world'):
return Response('Hello %s!' % name))</pre>
</div>
<p>... Easy as pie! Save these at the end of our <tt class="docutils literal"><span class="pre">handler.py</span></tt> file.</p>
<div class="section" id="route-handling-gotcha-s">
<h3>Route handling gotcha’s<a class="headerlink" href="#route-handling-gotcha-s" title="Permalink to this headline">¶</a></h3>
<p>After adding the two example routes, we have a handler for <tt class="docutils literal"><span class="pre">/</span></tt> and
<tt class="docutils literal"><span class="pre">/sayhello</span></tt>. If you try to access <tt class="docutils literal"><span class="pre">/foo</span></tt> you will get an 404 exception.
However, accessing <tt class="docutils literal"><span class="pre">/sayhello/master</span></tt> does something quite different :)</p>
</div>
</div>
<div class="section" id="starting-the-development-server">
<h2>Starting the development server<a class="headerlink" href="#starting-the-development-server" title="Permalink to this headline">¶</a></h2>
<p>Pyroutes includes a development server to ease local development quite a bit.
It’s located in the <tt class="docutils literal"><span class="pre">pyroutes.utils</span></tt> module.</p>
<p>Using it is as easy as adding this to <tt class="docutils literal"><span class="pre">handler.py</span></tt> from the previous
examples.:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">pyroutes.utils</span> <span class="kn">import</span> <span class="n">devserver</span>
<span class="n">devserver</span><span class="p">(</span><span class="n">application</span><span class="p">)</span>
</pre></div>
</div>
<div class="section" id="serving-static-media">
<h3>Serving static media<a class="headerlink" href="#serving-static-media" title="Permalink to this headline">¶</a></h3>
<p>Static media is normally served directly from the web server, but we need
static files when developing locally as well. You can serve static files through
the devserver using the <tt class="docutils literal"><span class="pre">fileserver</span></tt> route in <tt class="docutils literal"><span class="pre">pyroutes.utils</span></tt>. Change the
previous code to something like this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">pyroutes</span> <span class="kn">import</span> <span class="n">utils</span>
<span class="n">route</span><span class="p">(</span><span class="s">'/media'</span><span class="p">)(</span><span class="n">utils</span><span class="o">.</span><span class="n">fileserver</span><span class="p">)</span>
<span class="n">utils</span><span class="o">.</span><span class="n">devserver</span><span class="p">(</span><span class="n">application</span><span class="p">)</span>
</pre></div>
</div>
<p>This will now serve anything you have in the folder called <tt class="docutils literal"><span class="pre">media</span></tt> in your
working directory in the <tt class="docutils literal"><span class="pre">/media</span></tt> path. This behaviour can be modified in
<tt class="docutils literal"><span class="pre">pyroutes_settings</span></tt>.</p>
</div>
</div>
<div class="section" id="firing-it-up">
<h2>Firing it up<a class="headerlink" href="#firing-it-up" title="Permalink to this headline">¶</a></h2>
<p>Let’s try what we have so far. Open up a terminal, go to the directory where
you saved the <tt class="docutils literal"><span class="pre">handler.py</span></tt> file, and execute it:</p>
<div class="highlight-python"><pre>$ python handler.py
Starting server on 0.0.0.0 port 8001...</pre>
</div>
<p>Your application should now be running on port 8001. Let’s try it.:</p>
<div class="highlight-python"><pre>$ echo `wget -q -O - http://localhost:8001/`
Hello world!
$ echo `wget -q -O - http://localhost:8001/sayhello/Pyroutes`
Hello Pyroutes!</pre>
</div>
</div>
<div class="section" id="debugging">
<h2>Debugging<a class="headerlink" href="#debugging" title="Permalink to this headline">¶</a></h2>
<p>If something in the code was not correct, and an exception was thrown, you’ll
get a error page with not much information. You can see more about what went
wrong if you enable pyroutes’ debugging.</p>
<p>This is done by creating a file called <tt class="docutils literal"><span class="pre">pyroutes_settings.py</span></tt> in your
<tt class="docutils literal"><span class="pre">PYTHONPATH</span></tt>. Create this file and add:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">DEBUG</span><span class="o">=</span><span class="bp">True</span>
</pre></div>
</div>
<p>Now refresh the page with the error, and you’ll get a lot more information to work with.</p>
</div>
<div class="section" id="using-urls-as-data">
<h2>Using URLs as data<a class="headerlink" href="#using-urls-as-data" title="Permalink to this headline">¶</a></h2>
<p>As of Pyroutes >= 0.3.0 using URLs as data for your handler really simple.
Let’s create an <tt class="docutils literal"><span class="pre">archive</span></tt> route as an example:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@route</span><span class="p">(</span><span class="s">'/archive'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">archive</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">day</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="s">'Year: </span><span class="si">%s</span><span class="s"> Month: </span><span class="si">%s</span><span class="s"> Day: </span><span class="si">%s</span><span class="s">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="n">day</span><span class="p">))</span>
</pre></div>
</div>
<p>And let’s try it:</p>
<div class="highlight-python"><pre>$ echo `wget -q -O - http://localhost:8001/archive`
(This returns Http404 because year is an obligatory parameter)
$ echo `wget -q -O - http://localhost:8001/archive/2010`
Year: 2010 Month: Day:
$ echo `wget -q -O - http://localhost:8001/archive/2010/02`
Year: 2010 Month: 02 Day:
$ echo `wget -q -O - http://localhost:8001/archive/2010/02/03`
Year: 2010 Month: 02 Day: 03
$ echo `wget -q -O - http://localhost:8001/archive/2010/02/03/foobar`
(This returns a Http404 because archive only accepts four parameters)</pre>
</div>
<p>This example should make the URL matching logic clear. Note: If a method
accepts a referenced argument list in the from *args, it will match any
subpath of its route address.</p>
<p>An example:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@route</span><span class="p">(</span><span class="s">'/archive'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">archive</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="s">'User requested /</span><span class="si">%s</span><span class="s"> under archive'</span> <span class="o">%</span> <span class="s">'/'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">))</span>
</pre></div>
</div>
</div>
<div class="section" id="accessing-request-data">
<h2>Accessing request data<a class="headerlink" href="#accessing-request-data" title="Permalink to this headline">¶</a></h2>
<p>One common operation in developing web applications is doing stuff with user
data. Pyroutes gives you easy access to the POST, GET and FILES posted to your
request handler.</p>
<div class="highlight-python"><pre>@route('/newpost')
def new_post(request):
if 'image' in request.FILES:
# Do stuff with image
filename = request.FILES['image'][0]
data = request.FILES['image'][1].read()
pass
category = request.GET.get('category','default')
title = request.POST.get('title', 'None')
if not title:
return Response('no title!')
return Response('OK')</pre>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">If multiple fields have the same name, the value in the respective
dicts are a list of the given values.</p>
</div>
</div>
<div class="section" id="sending-responses-to-the-user">
<h2>Sending responses to the user<a class="headerlink" href="#sending-responses-to-the-user" title="Permalink to this headline">¶</a></h2>
<p>Every route must return an instance of <tt class="docutils literal"><span class="pre">pyroutes.http.response.Response</span></tt>, or
one of it’s subclasses. The former defaults to sending a
<tt class="docutils literal"><span class="pre">text/html</span></tt>-response with status code <tt class="docutils literal"><span class="pre">200</span> <span class="pre">OK</span></tt>.</p>
<p>We have the follow built-in responses:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">Response</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">status_code</span><span class="o">=</span><span class="s">'200 OK'</span><span class="p">,</span>
<span class="n">default_content_header</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">Redirect</span><span class="p">(</span><span class="n">location</span><span class="p">)</span>
</pre></div>
</div>
<p>content may be any string or iterable. This means you can do something like this:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@route</span><span class="p">(</span><span class="s">'/pdf'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">pdf</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">"mypdf.pdf"</span><span class="p">),</span> <span class="p">[(</span><span class="s">'Content-Type'</span><span class="p">,</span> <span class="s">'application/pdf'</span><span class="p">)])</span>
</pre></div>
</div>
<p>Also available for convenience is the HttpException subclasses, also found
under <tt class="docutils literal"><span class="pre">pyroutes.http.response</span></tt>. An example (assuming a method <tt class="docutils literal"><span class="pre">decrypt</span></tt>
that can decrypt files by some algorithm):</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@route</span><span class="p">(</span><span class="s">'/decrypt_file'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="n">full_filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">secrets_folder</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exits</span><span class="p">(</span><span class="n">full_filename</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">Http404</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">decrypt</span><span class="p">(</span><span class="n">full_filename</span><span class="p">,</span> <span class="n">key</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">Http403</span>
</pre></div>
</div>
</div>
<div class="section" id="c-is-for-cookie">
<h2>C is for cookie..<a class="headerlink" href="#c-is-for-cookie" title="Permalink to this headline">¶</a></h2>
<p>Cookies are the de-facto way of storing data on the clients. Pyroutes uses
secure cookies by default. This means that if a user edits his own cookies,
pyroutes will not accept them. This is done by storing a HMAC-signature, based
on the cookie its signing and the <tt class="docutils literal"><span class="pre">SECRET_KEY</span></tt> in your settings, along with
the actual cookie.</p>
<p>Settings cookies:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@route</span><span class="p">(</span><span class="s">'/cookie-set'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_cookies</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">Response</span><span class="p">()</span>
<span class="n">response</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">add_cookie</span><span class="p">(</span><span class="s">'logged_in'</span><span class="p">,</span> <span class="s">'true'</span><span class="p">)</span>
<span class="c"># Insecure cookie setting</span>
<span class="n">response</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">add_unsigned_cookie</span><span class="p">(</span><span class="s">'blapp'</span><span class="p">,</span> <span class="s">'foo'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">response</span>
</pre></div>
</div>
<p>Retrieving cookies:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="nd">@route</span><span class="p">(</span><span class="s">'/cookie-get'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_cookies</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="n">logged_in</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">COOKIES</span><span class="o">.</span><span class="n">get_cookie</span><span class="p">(</span><span class="s">'logged_in'</span><span class="p">)</span>
<span class="n">blapp</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">COOKIES</span><span class="o">.</span><span class="n">get_unsigned_cookie</span><span class="p">(</span><span class="s">'blapp'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">logged_in</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="s">'Hi!'</span><span class="p">)</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="s">'Go away!'</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="let-s-go-templates">
<h2>Let’s go templates!<a class="headerlink" href="#let-s-go-templates" title="Permalink to this headline">¶</a></h2>
<p>Pyroutes bundles XML-Template, a template system created by Steinar H.
Gunderson, which might seem a bit «chunky», but it really fast, and guarantees
it’s output to be valid XML (or in our case XHTML). The big difference between
XML-template and most other template systems out there, is that XML-template is
purely a representation layer. You don’t have any logic in your templates.</p>
<p>Now, pyroutes has a small wrapper around XML-Template for handling the most
common template task; having a base-template, and a separate template for your
current task.:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">pyroutes.template</span> <span class="kn">import</span> <span class="n">TemplateRenderer</span>
<span class="n">tmpl</span> <span class="o">=</span> <span class="n">TemplateRenderer</span><span class="p">(</span><span class="s">'base.xml'</span><span class="p">)</span>
<span class="nd">@route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">tmpl</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s">'index.xml'</span><span class="p">,</span> <span class="p">{}))</span>
</pre></div>
</div>
<p>For more information about XML-Template, see <a class="reference internal" href="appendix/xmltemplate.html#xml-template-intro"><em>Introduction to XML::Template</em></a>.</p>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Let’s do it! (aka Quickstart)</a><ul>
<li><a class="reference internal" href="#application-entry-point">Application entry point</a></li>
<li><a class="reference internal" href="#adding-routes">Adding routes</a><ul>
<li><a class="reference internal" href="#route-handling-gotcha-s">Route handling gotcha’s</a></li>
</ul>
</li>
<li><a class="reference internal" href="#starting-the-development-server">Starting the development server</a><ul>
<li><a class="reference internal" href="#serving-static-media">Serving static media</a></li>
</ul>
</li>
<li><a class="reference internal" href="#firing-it-up">Firing it up</a></li>
<li><a class="reference internal" href="#debugging">Debugging</a></li>
<li><a class="reference internal" href="#using-urls-as-data">Using URLs as data</a></li>
<li><a class="reference internal" href="#accessing-request-data">Accessing request data</a></li>
<li><a class="reference internal" href="#sending-responses-to-the-user">Sending responses to the user</a></li>
<li><a class="reference internal" href="#c-is-for-cookie">C is for cookie..</a></li>
<li><a class="reference internal" href="#let-s-go-templates">Let’s go templates!</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="installation.html"
title="previous chapter">Installation</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="deployment.html"
title="next chapter">Deployment</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="sources/usage.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" size="18" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="deployment.html" title="Deployment"
>next</a> |</li>
<li class="right" >
<a href="installation.html" title="Installation"
>previous</a> |</li>
<li><a href="index.html">pyroutes v0.4.1 documentation</a> »</li>
</ul>
</div>
<div class="footer">
© Copyright 2009-2010, Kristian Klette.
Last updated on Apr 17, 2011.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.1.
</div>
</body>
</html>