本文目录导读:

是的,Django 和 FastAPI 可以一起使用,这种组合在近几年逐渐流行,主要目的是 取两者之长,避两者之短。
你可以让 Django 负责管理后台、数据库模型、用户认证这些“重型”功能,而 FastAPI 负责高性能的 API 接口(比如实时数据处理、AI 模型推理、高并发请求)。
以下是几种常见的整合方式及注意事项:
在同一个项目中共存(推荐方式)
这是最常用的方式,通过 Django 的 WSGI 应用和 FastAPI 的 ASGI 应用,在同一个服务器进程中运行,通过路由前缀来区分。
实现步骤:
-
安装依赖: 你需要同时安装 Django 和 FastAPI,以及一个支持 ASGI/WSGI 混合的服务器(比如Uvicorn)。
-
代码结构示例:
# myproject/asgi.py import os from django.core.asgi import get_asgi_application from fastapi import FastAPI from starlette.middleware.wsgi import WSGIMiddleware os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') # 初始化 Django ASGI 应用 django_app = get_asgi_application() # 创建 FastAPI 应用 fastapi_app = FastAPI() @fastapi_app.get("/fastapi/hello") async def fastapi_hello(): return {"message": "Hello from FastAPI"} # 创建主 ASGI 应用,通过路由前缀区分 app = FastAPI() # 将 FastAPI 的子应用挂载到 /fastapi 路径下 app.mount("/fastapi", fastapi_app) # 将 Django 应用挂载到根路径(或 /admin 等) app.mount("/", WSGIMiddleware(django_app)) -
运行方式: 使用 Uvicorn 运行主
asgi.py文件:uvicorn myproject.asgi:app --host 0.0.0.0 --port 8000
- 访问
http://localhost:8000/admin/-> 由 Django 处理 - 访问
http://localhost:8000/fastapi/hello-> 由 FastAPI 处理
- 访问
优点:
- 共享同一个 Django 的
settings.py、数据库配置、ORM 模型。 - 可以在 FastAPI 路由中直接使用 Django ORM 操作数据库。
- 部署简单,一个端口搞定。
缺点:
- 性能受限于 Django 的 WSGI 模式(因为 FastAPI 的异步性能在混合模式下可能没法完全发挥)。
- 配置比较复杂。
作为独立的微服务分别部署
这是更干净的架构,Django 服务跑在 8000 端口,FastAPI 服务跑在 8001 端口,它们通过 HTTP 请求或消息队列通信。
实现方式:
- Django:负责管理后台、用户认证、数据库主模型。
- FastAPI:负责提供高性能 API,比如推荐算法、实时聊天、文件处理。
- 通信:Django 可以调用 FastAPI 的接口,反之亦然,或者通过 Redis、RabbitMQ 等消息队列进行异步处理。
优点:
- 完全解耦,各自独立部署、扩展、升级。
- 性能最大化:FastAPI 跑在异步 ASGI 上,Django 跑在 WSGI 上,互不影响。
缺点:
- 架构复杂,需要处理服务发现、数据同步、事务一致性等问题。
- 需要额外部署负载均衡器(如 Nginx、Caddy)来分发流量。
在 FastAPI 中集成 Django ORM(另一种常见场景)
如果你希望完全使用 FastAPI 作为主框架,但需要利用 Django 强大的 Admin 后台或 ORM,可以这样做:
-
初始化 Django:
# main.py import os import django from fastapi import FastAPI os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') django.setup() # 关键:加载Django配置 from myapp.models import MyModel # 引入Django模型 app = FastAPI() @app.get("/items/") def read_items(): # 可以在FastAPI路由中使用Django ORM items = MyModel.objects.all() return {"items": list(items.values())}
关键注意事项
-
异步兼容问题:Django ORM 是同步的,如果在 FastAPI 的
async def路由中直接调用MyModel.objects.all(),会阻塞事件循环,解决方法:- 使用
sync_to_async包装器或asgiref.sync.sync_to_async。 - 或者直接使用同步路由(
def而不是async def),让 FastAPI 在线程池中运行它。
- 使用
-
中间件冲突:Django 的中间件(如 CSRF、Session)默认不会应用到 FastAPI 路由,你需要显式处理(比如在 FastAPI 路由上禁用 CSRF 认证)。
-
数据库连接池:Django 默认使用同步连接池,如果用方案一混合部署,注意数据库连接数不要超过数据库限制,可以配置
CONN_MAX_AGE参数。
要不要一起用?
| 场景 | 建议 |
|---|---|
| 项目已用 Django,想加高性能 API | 方案一(在同一项目中挂载 FastAPI)是最快捷的方式。 |
| 从零开始,需要 Admin 后台和高并发 API | 方案二(微服务架构)更干净,或者完全转向 FastAPI(但需要自己写 Admin)。 |
| 只想用 Django 的 ORM 和 Admin | 方案三(在 FastAPI 中导入 Django ORM)很实用。 |
可以一起用,而且效果很好。 这种组合特别适合需要强大后台管理(Django Admin)和现代化高性能 API(FastAPI)的项目,比如电商后台、数据分析平台、AI 推理服务等,推荐优先尝试 方案一 或 方案三。