Drop-in MessagePack support for ASGI applications and frameworks
Project description
msgpack-asgi
msgpack-asgi
allows you to add automatic MessagePack content negotiation to ASGI applications (Starlette, FastAPI, Quart, etc.), with a single line of code:
app.add_middleware(MessagePackMiddleware)
(You may want to adapt this snippet to your framework-specific middleware API.)
This gives you the performance benefits of MessagePack (e.g. reduced bandwidth usage) without having to change existing code. See also How it works.
Installation
Install with pip:
pip install "mspack-asgi==1.*"
Quickstart
First, you'll need an ASGI application. Let's use this sample application, which exposes an endpoint that returns JSON data:
# For convenience, we use some ASGI components from Starlette.
# Install with: `$ pip install starlette`.
from starlette.requests import Request
from starlette.responses import JSONResponse
async def get_response(request):
if request.method == "POST":
data = await request.json()
return JSONResponse({"data": data})
else:
return JSONResponse({"message": "Hello, msgpack!"})
async def app(scope, receive, send):
assert scope["type"] == "http"
request = Request(scope=scope)
response = await get_response(request)
await response(scope, receive, send)
Then, wrap your application around MessagePackMiddleware
:
from msgpack_asgi import MessagePackMiddleware
app = MessagePackMiddleware(app)
Serve your application using an ASGI server, for example with Uvicorn:
uvicorn app:app
Now, let's make a request that accepts MessagePack data in response:
curl -i http://localhost:8000 -H "Accept: application/x-msgpack"
You should get the following output:
HTTP/1.1 200 OK
date: Fri, 01 Nov 2019 17:40:14 GMT
server: uvicorn
content-length: 25
content-type: application/x-msgpack
��message�Hello, msgpack!
What happened? Since we told the application that we accepted MessagePack-encoded responses, msgpack-asgi
automatically converted the JSON data returned by the Starlette application to MessagePack.
We can make sure the response contains valid MessagePack data by making the request again in Python, and decoding the response content:
>>> import requests
>>> import msgpack
>>> url = "http://localhost:8000"
>>> headers = {"accept": "application/x-msgpack"}
>>> r = requests.get(url, headers=headers)
>>> r.content
b'\x81\xa7message\xafHello, msgpack!'
>>> msgpack.unpackb(r.content, raw=False)
{'message': 'Hello, msgpack!'}
msgpack-asgi
also works in reverse: it will automatically decode MessagePack-encoded data sent by the client to JSON. We can try this out by making a POST
request to our sample application with a MessagePack-encoded body:
>>> import requests
>>> import msgpack
>>> url = "http://localhost:8000"
>>> data = msgpack.packb({"message": "Hi, there!"})
>>> headers = {"content-type": "application/x-msgpack"}
>>> r = requests.post(url, data=data, headers=headers)
>>> r.json()
{'data': {'message': 'Hi, there!'}}
That's all there is to it! You can now go reduce the size of your payloads.
Limitations
msgpack-asgi
does not support request or response streaming. This is because the full request and response body content has to be loaded in memory before it can be re-encoded.
How it works
An ASGI application wrapped around MessagePackMiddleware
will perform automatic content negotiation based on the client's capabilities. More precisely:
- If the client sends MessagePack-encoded data with the
application/x-msgpack
content type,msgpack-asgi
will automatically re-encode it to JSON for your application to consume. - If the client sent the
Accept: application/x-msgpack
header,msgpack-asgi
will automatically re-encode any JSON response data to MessagePack for the client to consume.
(In other cases, msgpack-asgi
won't intervene at all.)
License
MIT
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
1.0.0 - 2020-26-03
First production/stable release.
Changed
- Switch to private module naming. Components should now be imported from the root package, e.g.
from msgpack_asgi import MessagePackMiddleware
. (Pull #5)
Fixed
- Add missing
MANIFEST.in
. (Pull #4)
0.1.0 - 2019-11-04
Initial release.
Added
- Add the
MessagePackMiddleware
ASGI middleware. - Add the
MessagePackResponse
ASGI response class.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file msgpack-asgi-1.0.0.tar.gz
.
File metadata
- Download URL: msgpack-asgi-1.0.0.tar.gz
- Upload date:
- Size: 7.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | dab20e5ed5cdba96704ffd86d40f3d3b6da19e9093255b88b01c3ae045749a05 |
|
MD5 | 5ee61ef3badfc0984873a348b266957c |
|
BLAKE2b-256 | bdead52c8a8be1a19ccdedf6ef5c3287110478dcd71b8183015d9a1cd85111b3 |
File details
Details for the file msgpack_asgi-1.0.0-py3-none-any.whl
.
File metadata
- Download URL: msgpack_asgi-1.0.0-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.8.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77dfbf422c170cab56520423e104c4103e766aa6313492a3cd992ff24072fa35 |
|
MD5 | 40f685022a9084aa9d41604fc205a3a5 |
|
BLAKE2b-256 | 004283830a240814c2d93a8c250ff801bcf909aeede5a9485ef272949fa0e11a |