Django启用安全WebSocket遇Daphne配置错误,求解决方案
Django SSL项目中Daphne启动报错的解决办法
问题背景
在搭建启用SSL的Django聊天项目时,使用sslserver包可正常开启HTTPS开发服务器,但切换到Daphne启动ASGI应用以支持安全WebSocket时,执行daphne sendapp.asgi:application出现以下错误:
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
现有关键配置
settings.py片段
INSTALLED_APPS = [ 'channels', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'sslserver', 'accounts', 'chat', ] #WSGI_APPLICATION = 'sendapp.wsgi.application' ASGI_APPLICATION = 'sendapp.asgi.application' CHANNEL_LAYERS = { "default": { "BACKEND": "channels.layers.InMemoryChannelLayer" }, }
asgi.py内容
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sendapp.settings') application = ProtocolTypeRouter({ 'https': get_asgi_application(), 'websocket': AuthMiddlewareStack(URLRouter(ws_urlpatterns)) })
原启动命令(sslserver)
python .\manage.py runsslserver --certificate .\sendapp\certif.crt --key .\sendapp\code.key 0.0.0.0:8000
解决办法
1. 启动时显式指定settings环境变量
直接在执行Daphne命令前设置DJANGO_SETTINGS_MODULE环境变量:
- Windows(CMD)
set DJANGO_SETTINGS_MODULE=sendapp.settings && daphne sendapp.asgi:application
- Windows(PowerShell)
$env:DJANGO_SETTINGS_MODULE="sendapp.settings"; daphne sendapp.asgi:application
- Linux/macOS
DJANGO_SETTINGS_MODULE=sendapp.settings daphne sendapp.asgi:application
2. 通过manage.py启动Daphne(推荐)
使用Django的manage.py启动Daphne,它会自动加载项目的settings配置,无需手动设置环境变量:
python manage.py daphne sendapp.asgi:application
3. 调整asgi.py的初始化顺序
确保get_asgi_application()在创建路由前执行(它会触发Django settings的初始化),修改asgi.py如下:
import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, AuthMiddlewareStack, URLRouter # 替换为你实际的websocket路由导入路径 from chat.routing import ws_urlpatterns os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sendapp.settings') # 先初始化Django ASGI应用 django_asgi_app = get_asgi_application() application = ProtocolTypeRouter({ 'https': django_asgi_app, 'websocket': AuthMiddlewareStack(URLRouter(ws_urlpatterns)) })
4. 用Daphne直接开启SSL(支持WSS)
如果需要通过Daphne同时启用HTTPS和安全WebSocket(WSS),可以在启动命令中添加证书和密钥参数:
# 通过manage.py启动的SSL版本 python manage.py daphne --cert-file ./sendapp/certif.crt --key-file ./sendapp/code.key sendapp.asgi:application 0.0.0.0:8000 # 或直接使用daphne命令(需先设置环境变量) DJANGO_SETTINGS_MODULE=sendapp.settings daphne --cert-file ./sendapp/certif.crt --key-file ./sendapp/code.key sendapp.asgi:application 0.0.0.0:8000
内容的提问来源于stack exchange,提问作者MalloryLP
相关产品推荐
相关产品推荐

