5

私はdjangoと一般的にpythonの世界に比較的慣れていません。しかし、私は ruby​​ の経験がある (2 年間 Rails を扱ってきた) ので、python/django の多くの概念は私にとってそれほど新しいものではありません。

とにかく、私はデータベース接続を持つPythonで小さなパッケージを書いています。このパッケージをdjango内だけでなく、django外の機能でも使用したいと考えています。そこで、django.dbを利用することにし、データベース接続や管理に関する記述について心配する必要はありません。

だから私は最初のモデルを書き始め、django 環境の外で最初のテストをしたいと思っていました。

私のパッケージには、他の django アプリケーション (settings.py ファイル) と同じ構成メカニズムを持たせることを考えました。DATABASES ディクショナリのみを含むファイル (テンプレートとして nodjango_settings.py と呼ばれる) を作成し、それに 2 つのカスタム変数を追加しました。

MYAPP_DB_ID   = "myappdb"
MYAPP_DB_PREFIX = "myapp_"
DATABASES = {
  MYAPP_DB_ID: {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME':   'myappdb',
  }
}

私のパッケージのディレクトリ構造は次のとおりです。

.
|-- README.txt
|-- doc
|   `-- db.txt
|-- setup.py
|-- src
|   |-- __init__.py
|   `-- myapp
|       |-- __init__.py
|       |-- exceptions.py
|       |-- models.py
|       |-- nodjango_settings.py
|       `-- nodjango_settings.pyc
`-- test
    `-- test.py

DJANGO_SETTINGS_MODULE 環境変数の処理方法と構成ファイルの読み取り方法を確認するために、djangos 独自のコードを少し読んでいたので、次のコードを に追加しましたmyapp/__init__py

import os

# try to look after the DJANGO_SETTINGS_MODULE environment variable
# if not present raise an import error

# code abstract from python2.6/site-packages/django/conf/__init__.py
try:
    settings_module = os.environ["DJANGO_SETTINGS_MODULE"]
    if not settings_module: # If it's set but is an empty string.
        raise KeyError
except KeyError:
    raise ImportError("The DJANGO_SETTINGS_MODULE environment variable is not present.")


# TODO: look at python2.6/site-packages/django/conf/__init__.py +93
# if you print sys.path then the project directory gets added
# in django/core/management/__init__.py with sys.path.append
from django.utils import importlib

p = importlib.import_module(settings_module)

print p.MYAPP_DB_ID

__init__.py実行したパッケージのルート ディレクトリで、意図したとおりに動作することをテストしたかったのです。

$ DJANGO_SETTINGS_MODULE="src.myapp.nodjango_settings" python src/myapp/__init__.py


Traceback (most recent call last):
  File "src/myapp/__init__.py", line 22, in <module>
    p = importlib.import_module(settings_module)
  File "/home/yanez/devpython/lib/python2.6/site-packages/django/utils/importlib.py",   line 35, in import_module
    __import__(name)
ImportError: No module named src.myapp.nodjango_settings

私はそれを期待していませんでした。新しい django アプリケーションを作成すると、manage.pyファイルが作成されます。そして、このファイルはDJANGO_SETTINGS_MODULE、アプリケーションのルート ディレクトリの観点から変数を settings.py ファイルに設定します。

django のコードをさらに読んdjango/core/management/__init__.pyで、アプリケーションのルート ディレクトリに が追加されていることに気付きましたsys.path。これも私の問題の解決策になる可能性がありますが、いじるのが良い考えかどうかはよくわかりsys.pathません。

自分の考えが良いものなのか悪いものなのかよくわかりません。それについてどう思うか、どこをどのように改善できるかを知りたいです。さらに、私の考えに固執する場合settings.py、設定モジュールを何度も再インポートすることなく、どうすればカスタム変数を読み込むことができますか?

ありがとう

4

1 に答える 1

3

mod_wsgi を使用して django プロジェクトをデプロイする場合、「sys.path」ダンスを実行し、DJANGO_SETTINGS_MODULE 環境変数を設定する wsgi (python) スクリプトを記述してから、wsgi アプリケーション オブジェクトなどを作成する必要があります。

なぜこれについて言及するのですか?私見によると、問題のこの部分を「myapp」内で処理しようとするのではなく、django プロジェクト コンテキストの外部でアプリを使用する場合のアプリケーション エントリ ポイントとなる個別の python スクリプトから処理し、「myapp」を純粋なライブラリ パッケージ。このランチャー スクリプトは、正しい環境 (sys.path、設定など) を設定します。記録として、設定モジュールは単なる Python モジュールであり、実行時には通常の Python オブジェクト (クラス「モジュール」のインスタンス) であり、モジュール インスタンスを作成する方法は (デフォルトのインポート メカニズム以外に) いくつかあります。それを sys.modules に追加します (ここで重要な点です)。

補足として、パッケージに設定を入れることは意味がありません。これは構成ファイルです。

編集:ええと、djangoスタンドアロンの一部を使用することについて何かがあることは知っていました。設定モジュール

于 2012-06-29T11:28:29.107 に答える