Исправил падение старта ASGI/JWT: перестроил порядок инициализации Django в ASGI и убрал ранние Django/SimpleJWT импорты из middleware.

This commit is contained in:
lizerk 2026-03-31 20:28:18 +03:00
parent 6ee32111db
commit 0833eb13ce
2 changed files with 19 additions and 11 deletions

View File

@ -1,13 +1,21 @@
from eusrr_backend.channels_jwt import JWTAuthMiddleware
from realtime.routing import websocket_urlpatterns
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
import os
from importlib import import_module
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "eusrr_backend.settings")
django_asgi_app = get_asgi_application()
JWTAuthMiddleware = import_module(
"eusrr_backend.channels_jwt"
).JWTAuthMiddleware
websocket_urlpatterns = import_module(
"realtime.routing"
).websocket_urlpatterns
application = ProtocolTypeRouter({
"http": django_asgi_app,

View File

@ -1,15 +1,11 @@
# eusrr_backend/channels_jwt.py
from __future__ import annotations
from typing import Optional
from urllib.parse import parse_qs
from channels.db import database_sync_to_async
from channels.middleware import BaseMiddleware
from django.contrib.auth import get_user_model
from rest_framework_simplejwt.tokens import UntypedToken
from rest_framework_simplejwt.authentication import JWTAuthentication
User = get_user_model()
class JWTAuthMiddleware(BaseMiddleware):
@ -32,7 +28,9 @@ class JWTAuthMiddleware(BaseMiddleware):
return None
@database_sync_to_async
def _get_user(self, validated_token) -> Optional[User]:
def _get_user(self, validated_token):
from rest_framework_simplejwt.authentication import JWTAuthentication
auth = JWTAuthentication()
user = auth.get_user(validated_token)
return user
@ -41,6 +39,8 @@ class JWTAuthMiddleware(BaseMiddleware):
try:
raw = self._get_raw_token(scope)
if raw:
from rest_framework_simplejwt.tokens import UntypedToken
token = UntypedToken(raw) # валидация подписи/срока
user = await self._get_user(token)
scope["user"] = user