同代码库多Django应用能否在服务端wsgi.py安全覆盖配置?如何操作?
方案可行性说明
首先明确:这个方案是完全安全可行的。PythonAnywhere平台上每个独立Web应用的WSGI进程完全隔离,各自的环境变量、加载逻辑互不干扰,通过独立的WSGI文件区分配置不会出现配置串用的问题。
具体实现步骤
步骤1:修改两个应用各自的WSGI文件
给每个应用的WSGI文件添加独有的实例标识环境变量,示例如下:
站点1的WSGI配置
# +++++++++++ DJANGO +++++++++++ import os import sys path = '/home/你的用户名/项目根目录' if path not in sys.path: sys.path.append(path) # 新增:标记当前为站点1实例 os.environ['APP_INSTANCE'] = 'site1' os.environ['DJANGO_SETTINGS_MODULE'] = 'core.settings' from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
站点2的WSGI配置
仅需要修改APP_INSTANCE的取值即可:
# 新增:标记当前为站点2实例 os.environ['APP_INSTANCE'] = 'site2'
步骤2:修改项目settings.py适配多实例
在core/settings.py中读取刚才设置的环境变量,根据实例类型加载对应数据库配置:
import os # 读取实例标识,默认值用于本地开发场景 APP_INSTANCE = os.getenv('APP_INSTANCE', 'local') # 按实例类型分配数据库配置 if APP_INSTANCE == 'site1': DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的站点1数据库名', 'USER': '站点1数据库用户名', 'PASSWORD': '站点1数据库密码', 'HOST': '站点1对应的数据库主机地址', } } elif APP_INSTANCE == 'site2': DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的站点2数据库名', 'USER': '站点2数据库用户名', 'PASSWORD': '站点2数据库密码', 'HOST': '站点2对应的数据库主机地址', } } else: # 本地开发默认数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
如果你使用.env文件存储配置
可以直接在WSGI中指定对应实例的.env文件路径,不需要修改settings的数据库逻辑:
- 项目根目录下准备两份.env文件:
.env.site1、.env.site2,分别写入两个实例的数据库配置 - 在WSGI文件中添加加载对应.env的逻辑,示例如下:
# 放在os.environ['DJANGO_SETTINGS_MODULE']之前 from dotenv import load_dotenv load_dotenv(os.path.join(path, f'.env.{os.environ["APP_INSTANCE"]}'))
生效操作
修改完WSGI文件和配置后,分别到PythonAnywhere的两个Web应用管理面板点击Reload按钮重启应用即可生效。
内容的提问来源于stack exchange,提问作者CFW
相关产品推荐
相关产品推荐

