单个Django项目内的各Django应用是否可以实现独立部署?
解决方案
完全可以在不拆分项目、不引入REST API交互的前提下实现两个应用的独立部署,具体方案如下:
1. 拆分独立配置入口
同一个代码仓库下为每个应用单独编写配置和路由文件:
- 为FooApp编写
settings_foo.py:仅注册FooApp到INSTALLED_APPS,仅配置FooApp对应的数据库连接,指定独立的路由文件urls_foo.py - 为BarApp编写
settings_bar.py:仅注册BarApp到INSTALLED_APPS,仅配置BarApp对应的数据库连接,指定独立的路由文件urls_bar.py - 两个路由文件分别只挂载对应应用的路由规则即可
2. 启动独立的服务进程
使用Gunicorn/uWSGI等WSGI服务器,分别基于两套配置启动独立的服务进程,监听不同的本地端口:
- FooApp服务监听本地
127.0.0.1:8001,启动命令示例:gunicorn --settings=你的项目名.settings_foo 你的项目名.wsgi:application -b 127.0.0.1:8001 - BarApp服务监听本地
127.0.0.1:8002,启动命令示例:gunicorn --settings=你的项目名.settings_bar 你的项目名.wsgi:application -b 127.0.0.1:8002
两个进程完全独立运行,修改其中一个应用后,仅需要重启对应服务进程即可,完全不会影响另一个应用的运行。
3. 同Nginx进程下的流量分发
在Nginx配置中做规则分发即可,支持两种分发方式:
- 域名分发:
foo.example.com的请求代理到127.0.0.1:8001,bar.example.com的请求代理到127.0.0.1:8002 - 路径前缀分发:
/foo开头的请求代理到FooApp服务,/bar开头的请求代理到BarApp服务
如果有静态资源需求,可以分别执行python manage.py collectstatic --settings=对应的配置文件,将两个应用的静态资源收集到不同目录,在Nginx中直接配置路径映射即可,不需要经过Django服务处理。
额外说明
如果两个应用存在内部逻辑交互需求,仍然可以直接通过Python导包的方式调用对方的方法、模型,不需要额外引入API通信,符合你的需求。如果后续需要完全拆分两个项目,也可以基于现在的配置做平滑迁移,改造成本极低。
内容的提问来源于stack exchange,提问作者djpanda
相关产品推荐
相关产品推荐

