Django本地设置
我试图在Django 1.2中使用local_setting,但它不适合我。 目前我只是将local_settings.py添加到我的项目中。
settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'banco1', # Or path to database file if using sqlite3. 'USER': 'root', # Not used with sqlite3. 'PASSWORD': '123', # Not used with sqlite3. 'HOST': 'localhost', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
local_settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'banco2', # Or path to database file if using sqlite3. 'USER': 'root', # Not used with sqlite3. 'PASSWORD': '123', # Not used with sqlite3. 'HOST': 'localhost', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
问题是local_settings.py不覆盖settings.py 。 哪里不对?
你不能只添加local_settings.py,你必须明确地导入它。
在settings.py的最后,添加这个:
try: from local_settings import * except ImportError: pass
try / except块就在那里,所以当你还没有真正定义一个local_settings文件时,Python会忽略这种情况。
这是我认为的最佳做法:
-
local_settings
从settings
导入 -
local_settings
覆盖特定于本地环境的设置,尤其是DATABASES
,SECRET_KEY
,ALLOWED_HOSTS
和DEBUG
variables - 传递给djangopipe理命令flag
--settings=local_settings
你可以像这样实现local_settings
:
from settings import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'banco2', # Or path to database file if using sqlite3. 'USER': 'root', # Not used with sqlite3. 'PASSWORD': '123', # Not used with sqlite3. 'HOST': 'localhost', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
还有一些关键点:
-
settings.py
在版本控制中,写的方式使得它可以被贡献者使用 -
local_settings.py
(或者更常见的是prod_settings.py
)prod_settings.py
版本控制中,在生产中通过指定--settings=prod_settings
或类似的命令来使用。
尽可能less的触摸股票设置文件也可以让您更轻松地升级您的django版本。 当您将Django升级到下一个版本时,请查看stock settings.py
中的差异和您的差异,并根据需要采取相应措施。 默认值的变化可能是重要的,你触摸原始settings.py
文件越less,越容易辨别上游的变化。
由于话题的复苏让我总结一下为什么你可能想要考虑这种方法:
-
一个愚蠢的设置文件是非常快速和容易改变; 特别是在生产环境中。 不需要python:任何笨蛋都可以跳进来,并在一个只列出名称和值的文件中更改数据库密码; 特别是与一个充满神秘危险的BIGCAPS名字的复杂python设置文件相比。
-
应用程序
settings
应该与应用程序code
完全分离。 你可以把一个config.ini放在版本库的根目录之外,再也不用担心repo pull破坏你的设置,或者你的个人设置污染了repo,或者你的settings.py中的那些聪明的代码没有把它放到repo中, 。
这不适用于小项目,但是对于更大的项目,我认为local_settings策略并没有削减; 随着时间的推移,有足够的应用程序编程会遇到困难, 主要是因为设置变得衍生和/或依赖。 根据强制导入local_settings
文件的本地设置, settings.py
中间的settings.py
可能会有很好的理由。 我发现事情开始变得混乱。
我目前的解决scheme是使用config
文件,我配音它“local.ini”。 它只保留在部署实例之间实际发生更改的那些值。 没有代码:它们只是价值和布尔值:
[global] domain = 127.0.0.1:8000 database_host = 127.0.0.1 database_name = test_database debug = Yes google_analytics_id = UA-DEV-1 payments = testing use_cdn = No
有了这个地方,我可以像处理任何其他应用程序代码一样对待settings.py
:调整它,检查它并部署它,而不必担心testing可能潜伏在local_settings python代码中的任何代码。 我的settings.py
没有竞争条件,当稍后的设置取决于本地设置时,我可以打开和closuresfunction,编写易于遵循的线性代码。 当我忘记添加一些新的值时,不再急于调整local_settings文件,并且不再有daves_local_settings.py
和bobs_local_settings.py
文件进入存储库。
from ConfigParser import RawConfigParser parser = RawConfigParser() APPLICATION_ROOT = path.abspath(path.dirname(__file__)) parser.readfp(open(path.join(APPLICATION_ROOT, 'local.ini'))) # simple variables DATABASE_HOST = parser.get('global', 'database_host') DATABASE_NAME = parser.get('global', 'database_name') # interdependencies from version import get_cdn_version CDN = 'd99phdomw5k72k.cloudfront.net' if parser.getboolean('global', 'use_cdn'): STATIC_URL = '/{}/static/{}/'.format(CDN, get_cdn_version()) else: STATIC_URL = '/static/' # switches payments = parser.get('global', 'payments') if payments == 'testing': PAYMENT_GATEWAY_ENDPOINT = 'https://api.sandbox.gateway.com' else: PAYMENT_GATEWAY_ENDPOINT = 'https://api.live.gateway.com'
如果遇到BOFH ,就像我有一次一样,他对能够将local.ini
作为/etc/ourapp.ini
粘贴到/etc
目录感到特别兴奋,因此应用程序目录本身是一个纯粹的存储库导出。 当然你可以用local_settings.py来做到这一点,但是他想做的最后一件事是乱七八糟的python代码。 一个简单的configuration文件,他可以处理。
我保留了__local_settings.py
的副本:
- 在版本控制中
local_settings.py
被忽略,而不是__local_settings.py
- 更新
README.md
以通知团队如何设置:cp {__,}local_settings.py
(为local_settings创build一个副本)
以往
我曾经导入这些设置。
# settings.py DATABASE = {...} try: from .local_settings import * except ImportError: pass
现在
我只是从local_settings.py
导入设置本身。
并使用以下命令: python manage.py runserver --settings=<proj>.local_settings
。
# local_settings.py & __local_settings.py from .settings import * DATABASE = {...}
而且,因为我通常不直接与manage.py
进行交互,因为我明确需要一些参数(例如address:port
)。 因此,我把所有这些命令放到我的Makefile
。
例如,这里是我的Makefile:
run: python manage.py runserver 0.0.0.0:8000 --settings=<proj>.local_settings sh: python manage.py shell_plus --settings=<proj>.local_settings dep: npm install pip install -r requirements.txt
从而:
make dep make sh make run
结论
假如你没有使用Makefile
作为你的工作stream,那么你可以使用早期的方法,但是如果你正在使用makefile,那么我相信最好在你的Makefile中更明确一些。
在运行服务器之前呢
export DJANGO_SETTINGS_MODULE=appname.local_settings.py
别忘了做
from settings import *
在你的local_settings.py文件中
我find了类似的解决scheme。 这是我对这种情况的configuration:
settings.py:
DEBUG = False try: from local_settings import * except ImportError: pass if DEBUG is False: ALLOWED_HOSTS = ['sth.com'] DATABASES = { .... }
local_settings.py:
from settings import * ALLOWED_HOSTS = ['*'] DEBUG = True DATABASES = { ... }