# Error Handling

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.

Index

Version: 13.0.0