我在我的django项目中使用客户设置,就像在manage.py中一样。我写道:
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "setting.windows")
...
当我运行我的代码时,我想在不同的设置中运行我的程序:
python manage.py runserver --settings=twoscoops.settings.local
在我的settings.py中我还添加了一些我的私有程序变量,不同的settings.py使用了不同的变量。如果我的models.py或其他类文件想要导入我的设置文件中定义的那些变量。如何编写import语句?
我的意思是,如果我做
import twoscops.settings.local
当我使用其他设置时,我可能会更改环境变量。 怎么做?
答案 0 :(得分:1)
实现此目的的一个好方法实际上是在操作系统中设置环境变量,然后在environment
模块中的Python代码中检查它(如下所示)。
注意:在目录结构方面使用适合您的任何内容 - 我使用<my app>/conf/envs/<some env>.py
进行特定于环境的设置
# twoscoops/conf/envs/current.py
"""
Imports the proper settings, based on the deployment environment's name (set
as an environment variable), defaulting to local settings.
"""
import os
from django.core.exceptions import ImproperlyConfigured
# Environments (these can be called anything you want)
ENV_LOCAL = 'local'
ENV_PROD = 'prod'
DEPLOYMENT_ENVS = (ENV_LOCAL, ENV_PROD)
# Get the deployment environment's name from the os environment
DEPLOYMENT_ENV = os.getenv('DJANGO_DEPLOYMENT_ENV', ENV_LOCAL)
# Ensure the deployment env's name is valid
if DEPLOYMENT_ENV not in DEPLOYMENT_ENVS:
raise ImproperlyConfigured(
u'Invalid `DJANGO_DEPLOYMENT_ENV`: {d}'.format(d=DEPLOYMENT_ENV)
)
# Import env-specific settings
if DEPLOYMENT_ENV == ENV_LOCAL:
# Local, native testing
from twoscoops.conf.envs.local import *
if DEPLOYMENT_ENV == ENV_PROD:
# Production
from twoscoops.conf.envs.prod import *
只需将from twosscoops.conf.envs.current import *
添加到每个主要设置模块中(您可能只有一个,或者您可能有一个用于API,一个用于网站等)。
您会注意到上面的示例默认为twoscoops.conf.envs.local
。如果你想使用另一个env(在我的例子中,只有prod
和local),只需在启动shell或服务器之前添加DJANGO_DEPLOYMENT_ENV
环境变量(或者在启动uWSGI之前在Upstart脚本中添加,等),像这样:
you@your-server$ export DJANGO_DEPLOYMENT_ENV=prod
you@your-server$ python manage.py shell
在Windows中,您也可以设置环境变量(我相信命令行,也可以通过GUI - Google会了解更多信息)。
答案 1 :(得分:0)
您还可以为本地开发做一点作弊,只需将export DJANGO_VARIABLE=value-of-variable
放在虚拟环境activate
脚本的末尾。
请注意,对于制作,您需要在Apache vhost配置中添加类似的内容(我确定它与nginx类似):
SetEnv DJANGO_VARIABLE value-of-variable
请注意,vhost配置中变量名和值之间缺少等号。