web-dev-qa-db-ja.com

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.pysettings.pyをオーバーライドしないことです。なにが問題ですか?

68
Michel Andrade

Local_settings.pyを追加するだけでなく、明示的にインポートする必要があります。

Settings.pyのvery endで、これを追加します:

try:
    from local_settings import *
except ImportError:
    pass

Try/exceptブロックが存在するため、Pythonはlocal_settingsファイルを実際に定義していない場合を無視します。

122
Daniel Roseman

トピックは定期的に再浮上しているため、このアプローチを検討する理由を要約します。

  • ダム設定ファイルは非常に高速で簡単に変更できます。特に本番環境では。いいえ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コードの混乱でした。彼が処理できるシンプルな設定ファイル。

10
John Mee

___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を使用している場合は、より明示的にする方が良いと思いますメイクファイル。

6
Yeo

サーバーを実行する前に

export Django_SETTINGS_MODULE=your_app_name.local_settings your_app_nameは、アプリの名前に置き換える必要があります。そしてすることを忘れないでください

from settings import *

local_settings.pyファイルで

3
Siddhesh Suthar

さらに別のアプローチは、 _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')   
_
1
Eugene Yarmash

これをファイル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.
    }
}
0
Holovin

同様の解決策を見つけました。これはこの場合の私の構成です:

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 = {
    ...
}
0
Darex1991