You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:55:25