在项目开发环境和生产环境,配置往往是不同的,例如在前者往往我们要打开DEBUG模式、为方便会使用sqlite数据库、使用Django自带的WSGIServer;但在生产环境,我们会关闭DEBUG模式,使用MySQL、PostgreSQL这样的数据库、使用Gunicorn和Nginx代替默认web服务、采用更为严格的访问限制。
项目往往是要同时运行在开发环境和生产环境中的,那么怎样实现两套配置分开呢?
在将项目部署至Platform.sh时,两环境分离的做法是,在settings.py文件中做一个条件判断,如果config.is_valid_platform()
为真,就用生产环境中的配置覆盖默认配置。该做法给了我启发。
如果是将项目部署在普通VPS上的话,我们可以设一个环境变量,如果该环境变量存在或为某个值,就表明是生产环境,应用某些配置。
在服务器上项目的根目录,运行下述命令:
1
2
3
4
5
6
7
8
| #写入文件
echo "export SECRET_ENVIRON='produc'" >> .DJANGO_SECRET
cat .DJANGO_SECRET #查看文件内容
source .DJANGO_SECRET # 读取并导入环境变量
env #查看系统环境变量
|
在项目settings.py文件中,就可以对应这样写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 根据环境变量判断为生产环境还是开发环境
import os
--snip--
try:
environ = os.environ["SECRET_ENVIRON"]
except KeyError as e:
raise RuntimeError("Could not find a SECRET_KEY in environment") from e
if environ: # 如果环境变量存在
DEBUG = False
DATABASES = {}
SECURE_REFERRER_POLICY = ""
# 等等
|
先尝试读取环境变量,如果没有该变量就引发错误,有的话就用新设置项覆盖settings.py前面的设置项。
另外我从网上看到有人是根据“主机名”来判断的:
1
2
3
4
5
6
7
8
9
10
11
| import socket
--snip--
# 根据主机名判断为生产环境还是开发环境
ay_dp_value = socket.gethostname().startswith('aoyu')
if not ay_dp_value:
DEBUG = False
DATABASES = {}
SECURE_REFERRER_POLICY = ""
# 等等
|
我开发环境的主机名是“aoyu”开头的,如果所在环境的主机名不是,那么就说明是生产环境了。
参考资料:
How do you configure Django for simple development and deployment?