Other Request Bodies¶
The previous example demonstrated how to accept the payload of
a POST
carrying HTML form data. What about POST
requests with data in some other format? Or even PUT
requests?
Here is an example which demonstrates how to get any request body,
regardless of its format - using the request’s
content
attribute.
The only significant difference between this example and the previous is that
instead of accessing request.args
in render_POST
, it
uses request.content
to get the request’s body
directly:
...
def render_POST(self, request):
content = request.content.read().decode("utf-8")
escapedContent = cgi.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
is a file-like object, so the
body is read from it. The exact type may vary, so avoid relying on non-file
methods you may find (such as getvalue
when request.content
happens
to be a BytesIO
instance).
Here’s the complete source for this example - again, almost identical to the
previous POST
example, with
only render_POST
changed:
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor, endpoints
import cgi
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 = cgi.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()