其他请求主体¶
前面的示例演示了如何接受带有 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()