Django开发环境和生产环境分离

在项目开发环境和生产环境,配置往往是不同的,例如在前者往往我们要打开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?