运行ASGI服务器时Django Admin静态文件无法找到求助
Django Admin静态文件404问题排查与解决
问题详情
静态文件已通过collectstatic收集到项目根目录的static文件夹,但使用Uvicorn启动ASGI应用后,访问Admin页面时所有CSS/JS资源返回404,终端日志显示静态资源路径请求失败。
我的配置与操作
settings.py相关配置
# ...其他配置 STATIC_ROOT = os.path.join(BASE_DIR, "static") STATIC_URL = 'static/' # ...其他配置
执行的命令
python manage.py collectstatic uvicorn Django_Channels.asgi:application --port 8000 --workers 4 --log-level debug --reload
终端错误日志
INFO: 127.0.0.1:51770 - "GET /static/admin/css/dashboard.css HTTP/1.1" 404 Not Found Not Found: /static/admin/css/responsive.css INFO: 127.0.0.1:51770 - "GET /static/admin/css/responsive.css HTTP/1.1" 404 Not Found Not Found: /static/admin/js/theme.js INFO: 127.0.0.1:51769 - "GET /static/admin/js/theme.js HTTP/1.1" 404 Not Found Not Found: /static/admin/js/nav_sidebar.js INFO: 127.0.0.1:51770 - "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 404 Not Found
解决步骤
1. 给ASGI应用添加静态文件处理中间件
Uvicorn本身不会自动处理静态文件,Django的ASGI应用在生产模式下也不会默认提供静态文件服务,需要借助WhiteNoise中间件实现:
- 先安装依赖:
pip install whitenoise - 修改
Django_Channels/asgi.py文件:
import os from django.core.asgi import get_asgi_application from whitenoise import WhiteNoise os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Django_Channels.settings') django_asgi_app = get_asgi_application() # 用WhiteNoise包装Django ASGI应用,指定静态文件根目录 application = WhiteNoise(django_asgi_app, root=os.path.join(BASE_DIR, "static")) # 若有Channels的WebSocket路由,继续保留原有配置 # application = ProtocolTypeRouter({ # "http": application, # "websocket": URLRouter(...) # })
2. 修正STATIC_URL的路径格式
当前STATIC_URL = 'static/'缺少前导斜杠,可能导致路径解析异常,修改为:
STATIC_URL = '/static/'
3. 重新确认静态文件收集结果
检查项目根目录的static/admin文件夹是否存在完整的css、js子文件夹及对应文件,若缺失则重新执行收集命令(清空旧文件避免干扰):
python manage.py collectstatic --clear
4. 开发环境临时调试方案(仅用于本地测试)
如果是开发阶段,可开启DEBUG = True,确保django.contrib.staticfiles在INSTALLED_APPS中,此时Django会自动处理静态文件请求,但生产环境禁止依赖此方式,必须用WhiteNoise或Nginx等反向代理处理静态资源。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

