Add a django middleware to cleanup db connections.

This severely impacts performance, though without it we are getting
django.db.utils.InterfaceError once connections in the pool go stale.
pull/92/head
Tom Hacohen 3 years ago
parent a7fdb4a108
commit 473448246f

@ -5,6 +5,7 @@ from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.trustedhost import TrustedHostMiddleware from fastapi.middleware.trustedhost import TrustedHostMiddleware
from .middleware import DjangoDbConnectionCleanupMiddleware
from .exceptions import CustomHttpException from .exceptions import CustomHttpException
from .msgpack import MsgpackResponse from .msgpack import MsgpackResponse
from .routers.authentication import authentication_router from .routers.authentication import authentication_router
@ -42,6 +43,7 @@ def create_application(prefix="", middlewares=[]):
app.include_router(test_reset_view_router, prefix=f"{BASE_PATH}/test/authentication") app.include_router(test_reset_view_router, prefix=f"{BASE_PATH}/test/authentication")
app.add_middleware(DjangoDbConnectionCleanupMiddleware)
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origin_regex="https?://.*", allow_origin_regex="https?://.*",

@ -0,0 +1,15 @@
from starlette.types import ASGIApp, Receive, Scope, Send
from django.db import close_old_connections, reset_queries
class DjangoDbConnectionCleanupMiddleware:
def __init__(self, app: ASGIApp):
self.app = app
async def __call__(self, scope: Scope, receive: Receive, send: Send):
reset_queries()
close_old_connections()
try:
await self.app(scope, receive, send)
finally:
close_old_connections()
Loading…
Cancel
Save