In this example we'll extend dynamic dispatch to return a 404 (not found) response when a client requests a non-existent URL.
As in the previous examples, we'll start with Site
, Resource
, and reactor
imports:
1 2 3
from twisted.web.server import Site from twisted.web.resource import Resource from twisted.internet import reactor
Next, we'll add one more import. NoResource
is one of the pre-defined error
resources provided by Twisted Web. It generates the necessary 404 response code
and renders a simple html page telling the client there is no such resource.
1
from twisted.web.error import NoResource
Next, we'll define a custom resource which does some dynamic URL dispatch. This example is going to be just like the previous one, where the path segment is interpreted as a year; the difference is that this time we'll handle requests which don't conform to that pattern by returning the not found response:
1 2 3 4 5 6 7 8
class Calendar(Resource): def getChild(self, name, request): try: year = int(name) except ValueError: return NoResource() else: return YearPage(year)
Aside from including the definition of YearPage
from
the previous example, the only other thing left to do is the
normal Site
and reactor
setup. Here's the
complete code for this example:
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
from twisted.web.server import Site from twisted.web.resource import Resource from twisted.internet import reactor from twisted.web.error import NoResource from calendar import calendar class YearPage(Resource): def __init__(self, year): Resource.__init__(self) self.year = year def render_GET(self, request): return "<html><body><pre>%s</pre></body></html>" % (calendar(self.year),) class Calendar(Resource): def getChild(self, name, request): try: year = int(name) except ValueError: return NoResource() else: return YearPage(year) root = Calendar() factory = Site(root) reactor.listenTCP(8880, factory) reactor.run()
This server hands out the same calendar views as the one from the previous installment, but it will also hand out a nice error page with a 404 response when a request is made for a URL which cannot be interpreted as a year.