16

広く提案されているように、Django の秘密鍵と DB パスを環境変数に分離しようとしているので、ローカル/運用サーバー間で同一のコード ベースを使用できます。

私が直面している問題は、Apache + mod_wsgi を実行している運用サーバーで環境変数を正しく設定してから読み取ることです。

Apache がそのユーザーとして実行されていないため、ユーザー プロファイルに設定された変数を使用できません。スコープが何らかの理由で異なるため、Virtual Hosts ファイルで設定された変数SetEnvは使用できません。

SOの回答の1、2いくつか読んだので、このブログに解決策がありました。

wsgi.py次のようなファイルを使用する現在のバージョンの Django にソリューションを適用する方法がわかりません。

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

そのブログ ソリューションを wsgi.py ファイルに適用するにはどうすればよいですか、または Django が取得できる環境変数を保存するためのより良い場所はありますか?

4

5 に答える 5

23

グラハムの答えに他の誰かが不満を感じている場合は、元の質問に対して実際に機能する解決策を次に示します。個人的には、Apache から環境変数を設定することは非常に便利で実用的であると感じています。特に、独自のホスティング環境を構成して、やりたいことが何でもできるからです。

wsgi.py (Django 1.5.4 でテスト済み)

from django.core.handlers.wsgi import WSGIHandler

class WSGIEnvironment(WSGIHandler):

    def __call__(self, environ, start_response):

        os.environ['SETTINGS_CONFIG'] = environ['SETTINGS_CONFIG']
        return super(WSGIEnvironment, self).__call__(environ, start_response)

application = WSGIEnvironment()

django.core.wsgi.get_wsgi_applicationマイナーな注意点として、現在のところ のみを返すの将来性のあるメソッドが失われますWSGIHandler()。メソッドが更新され、 Django も更新する場合は、引数が変更されたときにクラスWSGIHandler.__call__を更新する必要がある場合があります。WSGIEnvironmentこれは、利便性のために支払う非常に小さなペナルティだと思います。

于 2014-01-14T21:12:41.223 に答える
5

と同じくらい将来性のある代替ソリューションを次に示しget_wsgi_applicationます。Django の初期化で使用する環境変数を設定することもできます。

# in wsgi.py

KEYS_TO_LOAD = [
    # A list of the keys you'd like to load from the WSGI environ
    # into os.environ
]

def loading_app(wsgi_environ, start_response):
    global real_app
    import os
    for key in KEYS_TO_LOAD:
        try:
            os.environ[key] = wsgi_environ[key]
        except KeyError:
            # The WSGI environment doesn't have the key
            pass
    from django.core.wsgi import get_wsgi_application
    real_app = get_wsgi_application()
    return real_app(wsgi_environ, start_response)

real_app = loading_app

application = lambda env, start: real_app(env, start)

がそのプロセスをどのように管理しているかは 100% 明確mod_wsgiではありませんが、WSGI アプリを頻繁に再ロードすることはないと思います。その場合、Django の初期化によるパフォーマンスの低下は、最初のリクエスト内で 1 回だけ発生します。

または、Django を初期化する前に環境変数を設定する必要がない場合は、次を使用できます。

# in wsgi.py

KEYS_TO_LOAD = [
    # A list of the keys you'd like to load from the WSGI environ
    # into os.environ
]

from django.core.wsgi import get_wsgi_application
django_app = get_wsgi_application()

def loading_app(wsgi_environ, start_response):
    global real_app
    import os
    for key in KEYS_TO_LOAD:
        try:
            os.environ[key] = wsgi_environ[key]
        except KeyError:
            # The WSGI environment doesn't have the key
            pass
    real_app = django_app
    return real_app(wsgi_environ, start_response)

real_app = loading_app

application = lambda env, start: real_app(env, start)
于 2015-09-05T18:53:48.893 に答える
0

私は、製品コードと開発コードを分離し、両方をバージョン管理に追跡するという同じ問題に遭遇しました。本番サーバー用と開発サーバー用の異なるwsgiスクリプトを使用して問題を解決しました。ここに記載されているように、2 つの異なる設定ファイルを作成しますそして、それらを wsgi スクリプトで参照します。たとえば、以下は wsgi_production.py ファイルです

...
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.production")
...

および wsgi_development.py ファイルで

...
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings.development")
...
于 2018-05-16T10:58:59.877 に答える