我对django和蟒蛇世界都很陌生。但我有ruby的经验(已经使用rails 2年了)所以python / django的许多概念对我来说都不是那么新。
无论如何,我在python中编写一个小包,它将具有数据库连接,我想在django中使用这个包,但也在django之外的功能中使用。所以我决定利用 django.db 而不用担心编写任何数据库连接和管理内容。
所以我开始编写我的第一个模型,想在django环境之外进行第一次测试,我发现自己遇到了一些困难。
我想过为我的包提供与任何django应用程序相同的配置机制(我的意思是settings.py文件)。我写了一个文件(名为nodjango_settings.py作为模板),它只包含DATABASES字典并为其添加了两个自定义变量:
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
中阅读我的自定义变量而无需一遍又一遍地重新导入设置模块?
由于
答案 0 :(得分:3)
当使用mod_wsgi部署django项目时,必须编写一个wsgi(python)脚本,它执行“sys.path”跳舞并设置DJANGO_SETTINGS_MODULE环境变量,然后创建wsgi应用程序对象等。
为什么我提到这个?因为,恕我直言,你不应该尝试在“myapp”中处理这部分问题,而是从一个独特的python脚本,这将是在django项目上下文之外使用你的应用程序时的应用程序入口点,并保持“myapp”为纯库包。然后,此启动器脚本将负责设置正确的环境(sys.path,settings,whatever)。对于记录,设置模块只是一个Python模块,它在运行时是一个普通的python对象(类“模块”的实例),并且有很多方法(除了默认的导入机制)来创建模块实例并将其添加到sys.modules(这是重要的一点)。
作为附注,在包装中进行设置没有意义恕我直言,这是一个配置文件。
编辑:嗯,我知道有一些关于使用django standalone的一部分,这里是:https://docs.djangoproject.com/en/dev/topics/settings/#using-settings-without-setting-django-settings-module