错误处理¶
在本例中,我们将扩展动态分发,以便在客户端请求不存在的 URL 时返回 404(未找到)响应。
与之前的示例一样,我们将从 Site
、 Resource
、 reactor
和 endpoints
导入开始
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor, endpoints
接下来,我们将添加另一个导入。 notFound
是 Twisted Web 提供的预定义错误资源之一。它会生成必要的 404 响应代码,并呈现一个简单的 HTML 页面,告诉客户端没有这样的资源。
from twisted.web.pages import notFound
接下来,我们将定义一个自定义资源,它执行一些动态 URL 分发。本例将与 上一个示例 相同,其中路径段被解释为年份;不同之处在于,这次我们将处理不符合该模式的请求,并返回未找到的响应
class Calendar(Resource):
def getChild(self, name, request):
try:
year = int(name)
except ValueError:
return notFound()
else:
return YearPage(year)
除了包含来自上一个示例的 YearPage
的定义之外,剩下的唯一要做的事情是正常的 Site
和 reactor
设置。以下是本例的完整代码
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor, endpoints
from twisted.web.pages import notFound
from calendar import calendar
class YearPage(Resource):
def __init__(self, year):
Resource.__init__(self)
self.year = year
def render_GET(self, request):
cal = calendar(self.year)
return (b"<!DOCTYPE html><html><head><meta charset='utf-8'>"
b"<title></title></head><body><pre>" + cal.encode('utf-8') + b"</pre>")
class Calendar(Resource):
def getChild(self, name, request):
try:
year = int(name)
except ValueError:
return notFound()
else:
return YearPage(year)
root = Calendar()
factory = Site(root)
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880)
endpoint.listen(factory)
reactor.run()
此服务器提供与上一部分相同的日历视图,但它还会在请求的 URL 无法解释为年份时提供一个带有 404 响应的错误页面。