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.
This commit is contained in:
Tom Hacohen 2020-12-30 09:20:38 +02:00
parent a7fdb4a108
commit 473448246f
2 changed files with 17 additions and 0 deletions

View File

@ -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?://.*",

View File

@ -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()