我对 django 和一般的 python 世界都比较陌生。但是我有使用 ruby 的经验(使用 rails 已经 2 年了),所以 python/django 的许多概念对我来说并不新鲜。
无论如何,我正在用 python 编写一个小包,它将有一个数据库连接,我想在 django 内部使用这个包,但也在 django 之外的功能中使用这个包。所以我决定利用django.db而不必担心编写任何数据库连接和管理的东西。
所以我开始编写我的第一个模型,并想在 django 环境之外进行第一次测试,我发现自己遇到了一些困难。
我考虑过为我的包设置与任何 django 应用程序相同的配置机制(我的意思是 settings.py 文件)。我编写了一个仅包含 DATABASES 字典的文件(称为 nodjango_settings.py 作为模板)并向其中添加了两个自定义变量:
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
我正在阅读一点 djangos 自己的代码,以了解如何处理 DJANGO_SETTINGS_MODULE 环境变量并读取配置文件,因此将以下代码添加到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
而不必一遍又一遍地重新导入设置模块?
谢谢