Docker-Compose跨容器配置django.setup():WebSocket集成Django认证问题
解决Docker跨容器WebSocket与Django集成的认证及配置问题
一、推荐方案:通过Django API间接验证token(避免跨容器加载配置)
由于两个容器是隔离状态,直接在WebSocket容器中加载Django配置会引发路径依赖、模块找不到等问题,更合理的方式是借助Django提供的API接口完成token认证:
1. Django端添加token验证接口
在Django项目的任意app下创建认证视图:
from django.http import JsonResponse from django.contrib.auth import get_user_model import django_sesame User = get_user_model() def validate_sesame_token(request): token = request.GET.get("token") if not token: return JsonResponse({"valid": False, "error": "Token missing"}, status=400) user = django_sesame.authenticate(token=token) if user: return JsonResponse({"valid": True, "user_id": user.id, "username": user.username}) else: return JsonResponse({"valid": False, "error": "Invalid token"}, status=401)
在项目urls.py中配置路由:
path("api/validate-token/", validate_sesame_token, name="validate_token")
2. WebSocket服务器调用API完成认证
在WebSocket连接逻辑中,获取客户端携带的token,调用Django接口验证:
import websockets import asyncio import aiohttp async def authenticate_token(token): # django-service替换为Docker Compose中Django服务的名称 django_api_url = f"http://django-service:8000/api/validate-token/?token={token}" async with aiohttp.ClientSession() as session: async with session.get(django_api_url) as response: return await response.json() async def handle_websocket(websocket): # 接收客户端发送的认证token token = await websocket.recv() auth_result = await authenticate_token(token) if not auth_result["valid"]: await websocket.send("Authentication failed") await websocket.close() return # 认证通过后处理对战逻辑 await websocket.send(f"Welcome {auth_result['username']}") # ... 后续象棋对战逻辑代码
二、备选方案:直接在WebSocket容器加载Django配置(不推荐)
如果必须在WebSocket容器内直接使用django-sesame验证,需解决路径和配置问题:
1. 修正Python路径
在WebSocket的server.py开头添加:
import sys import os # 将Django项目根目录添加到Python路径,替换为实际挂载路径(如/app/code) sys.path.append("/path/to/django-project-root")
2. 正确设置环境变量
检查Django项目结构,确保DJANGO_SETTINGS_MODULE路径正确:
# 示例:若settings.py在code/app/下,路径为code.app.settings(注意不要多写一层app) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "code.app.settings")
3. 安装依赖并初始化Django
在WebSocket容器的requirements.txt中添加依赖:
django>=4.0 django-sesame>=3.0
完成路径和环境变量设置后初始化Django:
import django django.setup()
之后即可正常调用django_sesame.authenticate()方法。
三、Docker配置注意事项
- 若使用Docker Compose,确保两个服务处于同一网络,保证WebSocket服务能访问Django服务
- 若选择直接加载Django配置,需通过卷挂载将Django项目代码共享到WebSocket容器(会打破容器隔离,不推荐)
内容的提问来源于stack exchange,提问作者Pytolong
相关产品推荐
相关产品推荐

