AIOHTTPGridFS Example¶
Warning
Motor will be deprecated on May 14th, 2026, one year after the production release of the PyMongo Async driver. Critical bug fixes will be made until May 14th, 2027. We strongly recommend that Motor users migrate to the PyMongo Async driver while Motor is still supported. To learn more, see the migration guide.
Serve pre-compressed static content from GridFS over HTTP. Uses the aiohttp
web framework and AIOHTTPGridFS.
Instructions¶
Start a MongoDB server on its default port and run this script. Then visit:
Serve compressed static content from GridFS¶
import asyncio
import gzip
import tempfile
import aiohttp.web
from motor.aiohttp import AIOHTTPGridFS
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorGridFSBucket
client = AsyncIOMotorClient()
# Use Motor to put compressed data in GridFS, with filename "my_file".
async def put_gridfile():
with tempfile.TemporaryFile() as tmp:
with gzip.GzipFile(mode="wb", fileobj=tmp) as gzfile:
for _ in range(10):
gzfile.write(b"Nonesuch nonsense\n")
gfs = AsyncIOMotorGridFSBucket(client.my_database)
tmp.seek(0)
await gfs.upload_from_stream(
filename="my_file", source=tmp, metadata={"contentType": "text", "compressed": True}
)
asyncio.run(put_gridfile())
# Add "Content-Encoding: gzip" header for compressed data.
def gzip_header(response, gridout):
if gridout.metadata.get("compressed"):
response.headers["Content-Encoding"] = "gzip"
gridfs_handler = AIOHTTPGridFS(client.my_database, set_extra_headers=gzip_header)
app = aiohttp.web.Application()
# The GridFS URL pattern must have a "{filename}" variable.
resource = app.router.add_resource("/fs/{filename}")
resource.add_route("GET", gridfs_handler)
resource.add_route("HEAD", gridfs_handler)
aiohttp.web.run_app(app)