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_settingssettings导入
  • local_settings覆盖特定于本地环境的设置,尤其是DATABASESSECRET_KEYALLOWED_HOSTSDEBUGvariables
  • 传递给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.pyprod_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.pybobs_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 = { ... }