私は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
、設定モジュールを何度も再インポートすることなく、どうすればカスタム変数を読み込むことができますか?
ありがとう