116

私はDjangoの開発を行うときにSQLiteを使用する傾向があり ますが、ライブ サーバーではより堅牢なものが必要になることがよくあります (たとえば、 MySQL / PostgreSQLなど)。常に、Django の設定には他にも変更を加える必要があります: 異なるログの場所/強度、メディア パスなどです。

これらすべての変更をどのように管理して、デプロイをシンプルで自動化されたプロセスにしますか?

4

15 に答える 15

86

更新: django-configurationsがリリースされました。これは、手動で行うよりも、ほとんどの人にとっておそらくより良いオプションです。

手動で行う場合でも、以前の回答が当てはまります。

複数の設定ファイルがあります。

  • settings_local.py-データベース名、ファイルパスなどのホスト固有の構成。
  • settings_development.py-開発に使用される構成DEBUG = True
  • settings_production.py-本番環境で使用される構成SERVER_EMAIL

これらすべてを、最初にインポートし、次に他の2つのうちの1つをインポートするsettings.pyファイルと結び付けます。-とsettings_local.pyの2つの設定でどちらをロードするかを決定します。 を呼び出して、実行中のマシンのホスト名を検索し、リストでそのホスト名を検索し、ホスト名が検索されたリストに応じて2番目の設定ファイルをロードします。settings_local.pyDEVELOPMENT_HOSTSPRODUCTION_HOSTSsettings.pyplatform.node()

そうすれば、本当に心配する必要があるのは、settings_local.pyファイルをホスト固有の構成で最新の状態に保つことだけであり、それ以外はすべて自動的に処理されます。

ここで例を確認してください。

于 2008-09-17T22:27:35.390 に答える
26

個人的には、プロジェクトに単一の settings.py を使用します。それが存在するホスト名を検索するだけです (私の開発マシンには「gabriel」で始まるホスト名があるため、これだけです:

import socket
if socket.gethostname().startswith('gabriel'):
    LIVEHOST = False
else: 
    LIVEHOST = True

次に、他の部分には次のようなものがあります。

if LIVEHOST:
    DEBUG = False
    PREPEND_WWW = True
    MEDIA_URL = 'http://static1.grsites.com/'
else:
    DEBUG = True
    PREPEND_WWW = False
    MEDIA_URL = 'http://localhost:8000/static/'

等々。少し読みにくいですが、問題なく動作し、複数の設定ファイルを調整する必要がありません。

于 2008-09-18T03:45:38.247 に答える
25

settings.py の最後には、次のものがあります。

try:
    from settings_local import *
except ImportError:
    pass

このように、デフォルト設定を上書きしたい場合は、settings.py のすぐ隣に settings_local.py を配置するだけです。

于 2008-09-18T10:57:14.793 に答える
11

2つのファイルがあります。settings_base.pyこれには共通/デフォルト設定が含まれ、ソース管理にチェックインされます。各デプロイメントには個別settings.pyのがあり、最初に実行from settings_base import *され、必要に応じてオーバーライドされます。

于 2008-09-17T22:29:30.783 に答える
7

私が見つけた最も単純な方法は次のとおりです。

1)ローカル開発にデフォルトのsettings.pyを使用し、2)次で始まるproduction-settings.pyを作成します。

import os
from settings import *

そして、本番環境で異なる設定をオーバーライドするだけです。

DEBUG = False
TEMPLATE_DEBUG = DEBUG


DATABASES = {
    'default': {
           ....
    }
}
于 2010-07-08T07:38:28.410 に答える
2

複数のデータベースを使用して Django 自体をデプロイする問題については、多少関連しますが、Djangostackを参照してください。Apache、Python、Django などをインストールできる完全に無料のインストーラーをダウンロードできます。インストール プロセスの一環として、使用するデータベース (MySQL、SQLite、PostgreSQL) を選択できます。内部で展開を自動化する場合は、インストーラーを広範囲に使用します (無人モードで実行できます)。

于 2011-07-27T15:20:25.783 に答える
1

Jim が言及した複数の設定ファイルに加えて、私は settings.py ファイルの上部に 2 つの設定を配置し、コードのパスとサイトのベースへの URL を設定する傾向がありますBASE_DIRBASE_URL他のすべての設定は変更されます。これらに自分自身を追加します。

BASE_DIR = "/home/sean/myapp/" 例えばMEDIA_ROOT = "%smedia/" % BASEDIR

したがって、プロジェクトを移動するときは、これらの設定を編集するだけでよく、ファイル全体を検索する必要はありません。

また、リモート デプロイの自動化を促進する fabric とCapistrano (Ruby ツールですが、Django アプリケーションのデプロイに使用できます)も検討することをお勧めします。

于 2008-09-18T01:59:37.847 に答える
1

外部ディレクトリに settings.py ファイルがあります。そうすれば、ソース管理にチェックインされたり、デプロイによって上書きされたりすることはありません。これを Django プロジェクトの下の settings.py ファイルに、デフォルト設定とともに入れます。

import sys
import os.path

def _load_settings(path):    
    print "Loading configuration from %s" % (path)
    if os.path.exists(path):
    settings = {}
    # execfile can't modify globals directly, so we will load them manually
    execfile(path, globals(), settings)
    for setting in settings:
        globals()[setting] = settings[setting]

_load_settings("/usr/local/conf/local_settings.py")

注: local_settings.py を信頼できない場合、これは非常に危険です。

于 2009-10-06T18:22:51.197 に答える
1

さて、私はこの構成を使用します:

settings.py の末尾:

#settings.py
try:
    from locale_settings import *
except ImportError:
    pass

そして locale_settings.py で:

#locale_settings.py
class Settings(object):

    def __init__(self):
        import settings
        self.settings = settings

    def __getattr__(self, name):
        return getattr(self.settings, name)

settings = Settings()

INSTALLED_APPS = settings.INSTALLED_APPS + (
    'gunicorn',)

# Delete duplicate settings maybe not needed, but I prefer to do it.
del settings
del Settings
于 2011-08-13T00:16:52.940 に答える
1

複雑な答えがたくさん!

すべての settings.py ファイルには以下が含まれます。

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

そのディレクトリを使用して、次のように DEBUG 変数を設定します (開発コードがあるディレクトリに置き換えます)。

DEBUG=False
if(BASE_DIR=="/path/to/my/dev/dir"):
    DEBUG = True

その後、settings.py ファイルが移動されるたびに、DEBUG が False になり、それが本番環境になります。

開発環境の設定とは異なる設定が必要になるたびに、次を使用します。

if(DEBUG):
    #Debug setting
else:
    #Release setting
于 2018-02-22T22:02:53.753 に答える
0

SQLite の使用からステップ アップする必要があるかどうかは、サイトのサイズに依存すると思います。私はいくつかの小規模なライブ サイトで SQLite をうまく使用しており、うまく機能しています。

于 2008-09-20T15:37:23.877 に答える
0

私は環境を使用します:

if os.environ.get('WEB_MODE', None) == 'production' :
   from settings_production import *
else :
   from settings_dev import *

最終的にはテスト環境に特別な設定が必要になり、それをこの条件に簡単に追加できるため、これははるかに優れたアプローチだと思います。

于 2012-03-14T02:04:30.470 に答える