Django与FastAPI整合场景下Django Admin静态文件404问题的配置咨询
Django与FastAPI整合场景下Django Admin静态文件404问题的配置咨询
嗨,这个问题我之前整合Django和FastAPI的时候也碰到过~核心原因是你只挂载了Django的ASGI应用,但Django在DEBUG模式下的静态文件自动服务并没有被FastAPI的路由链接管,所以访问/dj/static/开头的Admin静态资源时,FastAPI不知道该去哪里找这些文件。
下面是具体的解决步骤,一步步来:
第一步:确认Django的静态文件基础配置没问题
先检查你的conf/settings.py,确保这几项都配置正确(默认Django项目大多已经有,但再确认下更稳妥):
INSTALLED_APPS里包含django.contrib.staticfiles(Admin的静态文件靠它来管理)- 保留
DEBUG = True(你已经设置了,DEBUG模式下Django会自动查找各app下的静态文件,不用提前收集) - 保留
STATIC_URL = 'static/'(你也已经设置了) - 可选:可以加上
STATIC_ROOT = BASE_DIR / 'staticfiles'(虽然DEBUG模式下用不上,但生产环境会用到,提前加上没坏处)
第二步:修改FastAPI主文件,挂载带静态文件处理的Django ASGI应用
你需要把Django的ASGI应用用ASGIStaticFilesHandler包裹,这样它就能处理静态文件请求了,然后再挂载到/dj路径下。
修改后的完整主文件代码如下:
import os import uvicorn from fastapi import FastAPI from django.conf import settings from django.apps import apps from django.core.asgi import get_asgi_application # 新增:导入Django的静态文件ASGI处理器 from django.contrib.staticfiles.handlers import ASGIStaticFilesHandler os.environ.setdefault("DJANGO_SETTINGS_MODULE", "conf.settings") apps.populate(settings.INSTALLED_APPS) app = FastAPI() # 修改这里:用ASGIStaticFilesHandler包装Django的ASGI应用 django_asgi_app = ASGIStaticFilesHandler(get_asgi_application()) app.mount("/dj", django_asgi_app) @app.get("/") def read_root(): return {"Message": "Hello World"} if __name__ == '__main__': uvicorn.run(app, host="0.0.0.0", port=8001)
第三步:测试验证
重启你的Uvicorn服务,然后访问http://localhost:8001/dj/admin,应该就能正常加载Admin的CSS、JS等静态资源了,不会再出现404错误。
额外的生产环境提示(提前避坑)
如果以后要切换到生产环境(DEBUG = False),记得:
- 先运行
python manage.py collectstatic命令,把所有静态文件(包括Admin的)收集到STATIC_ROOT指定的目录下 - 生产环境不建议用Django/ASGI来处理静态文件,最好用Nginx、Caddy这类反向代理服务器直接托管静态文件目录,性能会好很多
这样应该就能完美解决你的问题啦😉




