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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:42:22