2015-09-09 22:53:12 +00:00
|
|
|
sprockets.mixins.mediatype
|
|
|
|
==========================
|
2015-08-19 22:29:32 +00:00
|
|
|
A mixin that performs Content-Type negotiation and request/response
|
|
|
|
(de)serialization.
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-26 19:10:35 +00:00
|
|
|
|Documentation| |Build Badge| |Package Info|
|
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
This mix-in adds two methods to a ``tornado.web.RequestHandler`` instance:
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
- ``get_request_body() -> dict``: deserializes the request body according
|
|
|
|
to the HTTP ``Content-Type`` header and returns the deserialized body.
|
|
|
|
- ``send_response(object)``: serializes the response into the content type
|
|
|
|
requested by the ``Accept`` header.
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2016-04-03 11:41:15 +00:00
|
|
|
Before adding support for specific content types, you SHOULD install the
|
|
|
|
content settings into your ``tornado.web.Application`` instance. If you
|
|
|
|
don't install the content settings, then an instance will be created for
|
|
|
|
you by the mix-in; however, the created instance will be empty. You
|
|
|
|
should already have a function that creates the ``Application`` instance.
|
|
|
|
If you don't, now is a good time to add one.
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
from sprockets.mixins.mediatype import content
|
|
|
|
from tornado import web
|
|
|
|
|
|
|
|
def make_application():
|
|
|
|
application = web.Application([
|
|
|
|
# insert your handlers here
|
|
|
|
])
|
|
|
|
content.install(application, 'application/json', 'utf-8')
|
|
|
|
return application
|
|
|
|
|
2016-01-31 17:31:35 +00:00
|
|
|
Support for a content types is enabled by calling ``add_binary_content_type``,
|
|
|
|
``add_text_content_type`` or the ``add_transcoder`` functions with the
|
2015-08-19 22:29:32 +00:00
|
|
|
``tornado.web.Application`` instance, the content type, encoding and decoding
|
|
|
|
functions as parameters:
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
.. code-block:: python
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
import json
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-11-03 13:10:54 +00:00
|
|
|
from sprockets.mixins.mediatype import content
|
2015-08-19 22:29:32 +00:00
|
|
|
from tornado import web
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
def make_application():
|
|
|
|
application = web.Application([
|
|
|
|
# insert your handlers here
|
|
|
|
])
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2016-04-03 11:41:15 +00:00
|
|
|
content.install(application, 'application/json', 'utf-8')
|
2015-11-03 13:10:54 +00:00
|
|
|
content.add_text_content_type(application,
|
|
|
|
'application/json', 'utf-8',
|
|
|
|
json.dumps, json.loads)
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
return application
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
The *add content type* functions will add a attribute to the ``Application``
|
|
|
|
instance that the mix-in uses to manipulate the request and response bodies.
|
2016-01-31 17:31:35 +00:00
|
|
|
The *add_transcoder* function is similar except that it takes an object
|
|
|
|
that implements transcoding methods instead of simple functions. The
|
|
|
|
``transcoders`` module includes ready-to-use transcoders for a few content
|
|
|
|
types:
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
from sprockets.mixins.mediatype import content, transcoders
|
|
|
|
from tornado import web
|
|
|
|
|
|
|
|
def make_application():
|
|
|
|
application = web.Application([
|
|
|
|
# insert your handlers here
|
|
|
|
])
|
|
|
|
|
2016-04-03 11:41:15 +00:00
|
|
|
content.install(application, 'application/json', 'utf-8')
|
2016-02-01 15:06:46 +00:00
|
|
|
content.add_transcoder(application, transcoders.JSONTranscoder())
|
2016-01-31 17:31:35 +00:00
|
|
|
|
|
|
|
return application
|
|
|
|
|
|
|
|
In either case, the ``ContentMixin`` uses the registered content type
|
|
|
|
information to provide transparent content type negotiation for your
|
|
|
|
request handlers.
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
.. code-block:: python
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-11-03 13:10:54 +00:00
|
|
|
from sprockets.mixins.mediatype import content
|
2015-08-19 22:29:32 +00:00
|
|
|
from tornado import web
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-11-03 13:10:54 +00:00
|
|
|
class SomeHandler(content.ContentMixin, web.RequestHandler):
|
2015-08-19 22:29:32 +00:00
|
|
|
def get(self):
|
|
|
|
self.send_response({'data': 'value'})
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
def post(self):
|
|
|
|
body = self.get_request_body()
|
|
|
|
# do whatever
|
|
|
|
self.send_response({'action': 'performed'})
|
2015-06-08 20:28:30 +00:00
|
|
|
|
2015-08-19 22:29:32 +00:00
|
|
|
Based on the settings stored in the ``Application`` instance and the HTTP
|
|
|
|
headers, the request and response data will be handled correctly or the
|
|
|
|
appropriate HTTP exceptions will be raised.
|
2015-08-26 19:10:35 +00:00
|
|
|
|
2015-09-09 22:02:22 +00:00
|
|
|
.. |Documentation| image:: https://readthedocs.org/projects/sprocketsmixinsmedia-type/badge/?version=latest
|
|
|
|
:target: https://sprocketsmixinsmedia-type.readthedocs.org/
|
2021-10-01 12:36:51 +00:00
|
|
|
.. |Build Badge| image:: https://github.com/sprockets/sprockets.mixins.mediatype/actions/workflows/testing.yml/badge.svg
|
|
|
|
:target: https://github.com/sprockets/sprockets.mixins.mediatype/actions/workflows/testing.yml
|
2015-09-09 22:18:54 +00:00
|
|
|
.. |Package Info| image:: https://img.shields.io/pypi/v/sprockets.mixins.mediatype.svg
|
2015-09-09 22:46:32 +00:00
|
|
|
:target: https://pypi.python.org/pypi/sprockets.mixins.mediatype
|