其他请求主体

前面的示例演示了如何接受带有 HTML 表单数据的 POST 的有效负载。那么带有其他格式数据的 POST 请求呢?或者甚至 PUT 请求?以下示例演示了如何获取任何请求主体,无论其格式如何 - 使用请求的 content 属性。

此示例与前一个示例之间唯一的重大区别在于,它不是在 render_POST 中访问 request.args,而是使用 request.content 直接获取请求的主体。

...
    def render_POST(self, request):
        content = request.content.read().decode("utf-8")
        escapedContent = html.escape(content)
        return (b"<!DOCTYPE html><html><head><meta charset='utf-8'>"
                b"<title></title></head><body>"
                b"You submitted: " +
                escapedContent.encode("utf-8"))

request.content 是一个类似文件的对象,因此从它读取主体。确切的类型可能会有所不同,因此请避免依赖您可能找到的非文件方法(例如,当 request.content 恰好是 BytesIO 实例时,使用 getvalue)。

以下是此示例的完整源代码 - 与之前的 POST 示例几乎相同,只有 render_POST 发生了变化。

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

import html

class FormPage(Resource):
    def render_GET(self, request):
        return (b"<!DOCTYPE html><html><head><meta charset='utf-8'>"
                b"<title></title></head><body>"
                b"<form method='POST'><input name='the-field'></form>")

    def render_POST(self, request):
        content = request.content.read().decode("utf-8")
        escapedContent = html.escape(content)
        return (b"<!DOCTYPE html><html><head><meta charset='utf-8'>"
                b"<title></title></head><body>"
                b"You submitted: " +
                escapedContent.encode("utf-8"))

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