Python
Django

Djangoのsettings.py周りのメモ

Django 1.11.6版です

外のサーバに置いた時にいろいろ設定が必要だったりエラーがでたりしたので備忘録。

エンコード指定

Python3環境で作ってるといらないっぽいけどPython2環境で動かした時にエラーがでたので、両方で動くように常にファイル先頭に入れておいたほうが良さげです。

settings.py
# coding: utf-8

追加で外部ファイルから設定を読み込む

追加の設定を取り込みます。DBの設定とか書いてVCSでignore指定しておくとリポジトリにパスワードが保存されなくて良いですね。

settings.pyと同じ場所にlocal_settings.pyというファイルを置いてsettigs.pyの最後の方にimportを記述します。ファイルが無くても動くように例外を拾うようにしておきます。

settings.py
try:
    from .local_settings import *
except ImportError:
    pass

テスト用DBをsqliteにする

テストで本番DBにアクセスしたくないのでDBを変えます。特にsqliteにすることでDBの初期化が激っぱやになるので、普段のテストが気軽にできます。

外部ファイルでDBの設定を変える可能性があるので、settings.pyの一番最後に書くとよさげです。

python manage.py test

でテストを実行した時に、引数がtestなのでsys.argvにtestが含まれるかで判断できます。

settings.py
import sys
if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }

プロジェクトディレクトリ直下にtemplate

TEMPLATES の中の DIRS にos.path.join(BASE_DIR, 'templates')を追加します。

settings.py
TEMPLATES = [
    {
        'DIRS': [os.path.join(BASE_DIR, 'templates')],

プロジェクトディレクトリ直下にstatic

わりとネットの情報が錯綜しているところです。バージョンによって挙動が違うのかもしれません。

python manage.py collectstatic

が実行されると、STATIC_ROOTで指定したディレクトリに、SATATICFILES_DIRSで指定したディレクトリの中身がコピーされます。STATIC_ROOTにNginxやApacheが参照するディレクトリを指定するといった感じの想定でしょうか。

collectstatic使わないんだったらSTATIC_ROOTの設定はいらないようです。

settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

なお、staticは DEBUG=True のときしか使えません。

リバースプロキシでstatic

テンプレートで{{STATIC_URL}}使ってると、リバースプロキシ通すとURLがおかしくなるので対処します。

nginxの設定

        location /アプリ名/static/ {
                proxy_pass http://IPアドレス:8000/アプリ名/static/;
        }
        location /アプリ名/ {
                proxy_pass http://IPアドレス:8000/;
        }

※Djangoのstaticを止める時は、/アプリ名/static/の飛ばし先をWebサーバに変更します

後は、Djangoの追加設定を記述した外部ファイルで

local_settings.py
STATIC_URL = "/アプリ名/static/"

ALLOWED_HOSTSの設定

どこからでもアクセスできるようには

local_settings.py
ALLOWED_HOSTS=["localhost", "*"]

リバースプロキシからアクセスするには

local_settings.py
ALLOWED_HOSTS=["localhost", "リバースプロキシのIP"]

なおnginxで

proxy_set_header    Host        $http_host;

が設定されている場合、ホスト名で許可します

local_settings.py
ALLOWED_HOSTS=["localhost", "ホスト名"]

テンプレートで使えるデフォルトの変数を増やす

{{STATIC_URL}}みたいな、どのテンプレートでも使える変数を増やします。

まずsettings.pyに変数を追加します。ここではURL_ROOTを作ってみます。

settings.py
URL_ROOT = "/"

settings.pyと同じディレクトリに設定ファイルを追加。ファイル名はなんでもよいですが、ここでは仮にcontext_processors.pyとします。

ファイルの中に関数を1つ作り(これも名前はなんでもよい)、変数名とsettings.pyで作った公開したい変数のペアを返します。

context_processors.py
from django.conf import settings

def common_variables(request):
    return {
        'URL_ROOT': settings.URL_ROOT,
    }

settings.pyでこのファイルを TEMPLATES の OPTIONS の context_processors に追加します。

settings.py
TEMPLATES = [
    'OPTIONS': {
        'context_processors': [
            'プロジェクト名.追加したファイル名.作った関数名',

今回の例でいくと、追加するのは

'プロジェクト名.context_processors.common_variables',

これで個別にcontextにパラメータを設定しなくても、全てのテンプレートの中で{{URL_ROOT}}が使えるようになります。