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のvery endで、これを追加します:
try:
from local_settings import *
except ImportError:
pass
Try/exceptブロックが存在するため、Pythonはlocal_settingsファイルを実際に定義していない場合を無視します。
トピックは定期的に再浮上しているため、このアプローチを検討する理由を要約します。
ダム設定ファイルは非常に高速で簡単に変更できます。特に本番環境では。いいえpythonは必要ありません:どんなバカでも、名前と値をリストするだけのファイルでデータベースパスワードを変更できます。特に、神秘的な危険なBIGCAPS名でいっぱいの複雑なpython設定ファイルと比較して。
アプリケーションsettings
は、アプリケーションcode
から完全に分離する必要があります。 config.iniをリポジトリルートの外側に配置して、レポジトリプルが設定を上書きしたり、個人設定がレポを汚染したり、settings.pyの巧妙なコードが他の人の利益にならないことを心配する必要はありません。 。
これは小さなプロジェクトには当てはまりませんが、大きなプロジェクトでは、local_settings戦略ではうまくいかないと結論付けました。時間が経つにつれて、十分なアプリケーションプログラミングが忍び込み、扱いにくくなります。主に設定が派生的および/または共依存的になったとき。ローカル設定に従って反応する設定には、_local_settings
_ファイルのインポートを_settings.py
_の中央に向かって強制的に強制する適切な理由があります。それが起こると物事が乱雑になり始めると思います。
私の現在の解決策は、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
_を他のアプリケーションコードと同様に扱うことができます。local_settingspythonコード。私の_settings.py
_には、後の設定がローカル設定に依存する場合に発生する競合状態がなく、わかりやすい線形コードの記述の機能のオンとオフを切り替えることができます。新しい値を追加するのを忘れたときに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
_ディレクトリを_/etc/ourapp.ini
_として、アプリケーションディレクトリ自体を純粋なリポジトリエクスポートとして保持します。確かにlocal_settings.pyでそれを行うことができましたが、彼がやりたかった最後のことはpythonコードの混乱でした。彼が処理できるシンプルな設定ファイル。
___local_settings.py
_のコピーを保管しました:
local_settings.py
_はバージョン管理では無視されますが、___local_settings.py
_は無視されませんREADME.md
_を更新して、セットアップ方法をチームに通知します:_cp {__,}local_settings.py
_(local_settingsのコピーを作成します)これらの設定をインポートするために使用しました。
_# 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
_
あなたがnotワークフローとしてMakefile
を使用している場合、以前の方法を使用できますが、makefileを使用している場合は、より明示的にする方が良いと思いますメイクファイル。
サーバーを実行する前に
export Django_SETTINGS_MODULE=your_app_name.local_settings
your_app_nameは、アプリの名前に置き換える必要があります。そしてすることを忘れないでください
from settings import *
local_settings.pyファイルで
さらに別のアプローチは、 _python-dotenv
_ と環境変数を使用して、異なる環境の設定をカスタマイズすることです。
_.env
_と一緒に_settings.py
_ファイルを作成します。
_# .env
SECRET_KEY=your-secret-key
DATABASE_PASSWORD=your-database-password
_
_settings.py
_に次のコードを追加します。
_# settings.py
from dotenv import load_dotenv
load_dotenv()
# OR, explicitly providing path to '.env'
from pathlib import Path # python 3.4+
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)
_
この時点で、_.env
_ファイルから解析されたキー/値は環境変数として存在し、os.getenv()
を介して便利にアクセスできます。
_# settings.py
import os
SECRET_KEY = os.getenv('SECRET_KEY')
DATABASE_PASSWORD = os.getenv('DATABASE_PASSWORD')
_
これをファイルsettings.pyの最後に追加します
try:
from .local_settings import *
except ImportError:
pass
そして、例えば新しい設定で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.
}
}
同様の解決策を見つけました。これはこの場合の私の構成です:
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 = {
...
}