自定义响应代码

前面的示例介绍了 NoResource,这是一个 Twisted Web 错误资源,它返回 404(未找到)代码。本示例将介绍 NoResource 使用的 API,以便您可以根据需要生成自己的自定义响应代码。

首先,是标准的导入前缀

from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor, endpoints

现在,我们将定义一个新的资源类,它始终返回 402(需要付款)响应。这与前面示例中定义的资源并没有太大区别。它具有除 200 之外的响应代码,但这不会改变它在其他方面的作用。这将需要使用请求对象,而前面的示例都没有这样做。

Request 对象已在几个地方出现,但到目前为止我们一直忽略它。它是 getChild API 以及 render_GET 等渲染方法的参数。正如您可能已经猜到,它代表需要生成响应的请求。此外,它还代表正在生成的响应。在本示例中,我们将使用它的 setResponseCode 方法来 - 您猜对了 - 设置响应的状态代码。

class PaymentRequired(Resource):
    def render_GET(self, request):
        request.setResponseCode(402)
        return b"<html><body>Please swipe your credit card.</body></html>"

就像我演示过的其他资源一样,这个资源从它的 render_GET 方法返回一个字符串来定义响应的主体。唯一不同的是调用 setResponseCode 来用不同的代码覆盖默认的响应代码 200。

最后,是设置站点和反应器的代码。我们将上述定义的资源的实例放在 /buy

root = Resource()
root.putChild(b"buy", PaymentRequired())
factory = Site(root)
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880)
endpoint.listen(factory)
reactor.run()

以下是完整的示例

from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor, endpoints

class PaymentRequired(Resource):
    def render_GET(self, request):
        request.setResponseCode(402)
        return b"<html><body>Please swipe your credit card.</body></html>"

root = Resource()
root.putChild(b"buy", PaymentRequired())
factory = Site(root)
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880)
endpoint.listen(factory)
reactor.run()

运行服务器并在浏览器中访问 http://localhost:8880/buy。它看起来可能很无聊,但如果您使用 Firefox 的“查看页面信息”右键菜单项(或您浏览器的等效项),您将能够看到服务器确实返回了 402 响应代码。