Request Router » History » Version 2
Jan Klopper, 2012-04-10 15:16
1 | 1 | Jan Klopper | h1. The Request Router |
---|---|---|---|
2 | 1 | Jan Klopper | |
3 | 1 | Jan Klopper | µWeb is build around a so called MVC design, which often involves a routing layer that takes any inbound requests for pages, and delegates them to the appropriate methods inside the application. |
4 | 1 | Jan Klopper | The µWeb router is based on regexes that match urls, and possibly extract various parts of the url to hand over to the pagemaker as arguments. |
5 | 1 | Jan Klopper | |
6 | 1 | Jan Klopper | Next to the routes, the router is also the startpoint for both the mod_python and [[standalone]] versions of µWeb, and because of that its the point where we accept various global settings that define where µWeb should load the templates, where the pagemaker can be found, and how the logging should work. |
7 | 1 | Jan Klopper | |
8 | 1 | Jan Klopper | h2. Some examples |
9 | 2 | Jan Klopper | |
10 | 1 | Jan Klopper | <pre><code class="python"> |
11 | 1 | Jan Klopper | #!/usr/bin/python |
12 | 1 | Jan Klopper | """Some website""" |
13 | 1 | Jan Klopper | |
14 | 1 | Jan Klopper | # Custom modules |
15 | 1 | Jan Klopper | import uweb |
16 | 1 | Jan Klopper | import pages |
17 | 1 | Jan Klopper | |
18 | 1 | Jan Klopper | __author__ = 'yourname <yourname@yourdomain.nl>' |
19 | 1 | Jan Klopper | __version__ = '0.1' |
20 | 1 | Jan Klopper | |
21 | 1 | Jan Klopper | PACKAGE = 'some_website' |
22 | 1 | Jan Klopper | PAGE_CLASS = pages.PageMaker |
23 | 1 | Jan Klopper | CONFIG = '../website.conf' |
24 | 1 | Jan Klopper | </code></pre> |
25 | 1 | Jan Klopper | |
26 | 1 | Jan Klopper | In the above example we setup a router by doing the following: |
27 | 1 | Jan Klopper | * We import uweb, |
28 | 1 | Jan Klopper | * We import our module where our Pagemaker class lives. |
29 | 1 | Jan Klopper | * We set some copyright / author information (µWeb does not use these, buts its good python practise) |
30 | 1 | Jan Klopper | * We set the PACKAGE variable so that the logging module knows what name this website has. |
31 | 1 | Jan Klopper | * We set the PAGE_CLASS variable to the class that holds all of the request pages. |
32 | 1 | Jan Klopper | * We set the config path, so µWeb can find and load the settings for for example mysql, mongo or settings you use in your application. |
33 | 1 | Jan Klopper | |
34 | 1 | Jan Klopper | After this, we will need to setup some actual routers to route incoming requests to the correct pages. |
35 | 1 | Jan Klopper | |
36 | 1 | Jan Klopper | <pre><code class="python"> |
37 | 1 | Jan Klopper | ROUTES = ( |
38 | 1 | Jan Klopper | ('/', 'RequestIndex'), |
39 | 1 | Jan Klopper | # static |
40 | 1 | Jan Klopper | ('(/styles/.*)', 'Static'), |
41 | 1 | Jan Klopper | ('(/js/.*)', 'Static'), |
42 | 1 | Jan Klopper | ('(/media/.*)', 'Static'), |
43 | 1 | Jan Klopper | # Error handling |
44 | 1 | Jan Klopper | ('(/.*)', 'RequestInvalidcommand') |
45 | 1 | Jan Klopper | ) |
46 | 1 | Jan Klopper | </code></pre> |
47 | 1 | Jan Klopper | |
48 | 1 | Jan Klopper | The above routes do the following: |
49 | 1 | Jan Klopper | * We send traffic that requests '/' to the method RequestIndex |
50 | 1 | Jan Klopper | * We send anything that begins with either /styles/ /js/ or /media/ to the built in Static handler, from where µWeb will try to read the file including the styles/js or media part. |
51 | 1 | Jan Klopper | * All other requests will be handled by RequestInvalidcommand, which in our case usually returns a nice 404 page. |
52 | 1 | Jan Klopper | |
53 | 1 | Jan Klopper | As you can see, every match we make in the regex will be a new argument on the recipient method. |
54 | 1 | Jan Klopper | |
55 | 1 | Jan Klopper | To make the actual server run, we do one last command: |
56 | 1 | Jan Klopper | <pre><code class="python"> |
57 | 1 | Jan Klopper | uweb.ServerSetup() |
58 | 1 | Jan Klopper | </code></pre> |
59 | 1 | Jan Klopper | |
60 | 1 | Jan Klopper | h2. More examples |
61 | 1 | Jan Klopper | |
62 | 1 | Jan Klopper | How to use various other url formats: |
63 | 1 | Jan Klopper | |
64 | 1 | Jan Klopper | * If you want to match random word like characters, dashes and spaces, and possibly include a trailing / you can use something like this: |
65 | 1 | Jan Klopper | ** ([\w\- ]+)/? |
66 | 1 | Jan Klopper | * If you want to match multiple words, and send them as arugments the Method like this: /somecommand/userX/projectY/edit/ use the following, again with the optional slash at the end. |
67 | 1 | Jan Klopper | ** '/somecommand/([\w\- ]+)/([\w\-]+)/othercommand/?' |
68 | 1 | Jan Klopper | * If you want to include an optinal page number after a command: |
69 | 1 | Jan Klopper | ** /somecommand/?(\d+)? |
70 | 1 | Jan Klopper | ** This will for example match: /somecommand, /somecommand/10 /somecommand/10/ and in both the last two send 10 as the first argument to the method processing the request. |
71 | 1 | Jan Klopper | |
72 | 1 | Jan Klopper | h2. Static files |
73 | 2 | Jan Klopper | |
74 | 1 | Jan Klopper | µWeb can handle Static files from disk by itself, you just need to point the routes to the Static method, and give it the correct path where it can find the resource. |
75 | 1 | Jan Klopper | The mime-type will be discovered automatically by using the Magic libraries avialable on your server. |
76 | 1 | Jan Klopper | |
77 | 1 | Jan Klopper | h2. OpenID routers |
78 | 2 | Jan Klopper | |
79 | 1 | Jan Klopper | How to setup routes if you want to use the openID module: |
80 | 1 | Jan Klopper | * ('/OpenIDLogin/?(\w+)?', '_OpenIdInitiate') |
81 | 1 | Jan Klopper | * ('/OpenIDValidate', '_OpenIdValidate') |