gpt4 book ai didi

python - 在 django 内部和外部工作的包。这是一个好的设计吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:56 26 4
gpt4 key购买 nike

我是 django 的新手,一般来说是 python 世界的新手。但是我有使用 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 中读取我的自定义变量,而不必一遍又一遍地重新导入设置模块?

谢谢

最佳答案

当使用 mod_wsgi 部署 django 项目时,必须编写一个 wsgi(python)脚本,执行“sys.path”舞蹈并设置 DJANGO_SETTINGS_MODULE 环境变量,然后创建 wsgi 应用程序对象等。

我为什么要提到这个?因为,恕我直言,您不应该尝试在“myapp”中处理这部分问题,而是在 django 项目上下文之外使用您的应用程序时,从一个独特的 python 脚本作为应用程序入口点,并将“myapp”保留为纯库包。然后,此启动器脚本将负责设置正确的环境(sys.path、设置等)。作为记录,设置模块只是一个 Python 模块,它在运行时是一个普通的 Python 对象(类“模块”的实例),并且有很多方法(除了默认的导入机制)来创建模块实例并将其添加到 sys.modules(这是这里的重点)。

附带说明一下,恕我直言,在包中进行设置没有任何意义,它是一个配置文件。

编辑:好吧,我知道使用独立的 django 的一部分是有好处的,这里是:https://docs.djangoproject.com/en/dev/topics/settings/#using-settings-without-setting-django-settings-module

关于python - 在 django 内部和外部工作的包。这是一个好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com