导入单个 Django 设置常量以避免完整设置导入开销的正确方法?

Posted

技术标签:

【中文标题】导入单个 Django 设置常量以避免完整设置导入开销的正确方法?【英文标题】:Proper way to import a single Django settings constant to avoid the full settings import overhead? 【发布时间】:2012-03-07 09:05:00 【问题描述】:

来自Django - Difference between import django.conf.settings and import settings,我了解导入设置文件的公认方式:

from django.conf import settings

我也读过Good or bad practice in Python: import in the middle of a file。那里的答案之一会将您带到http://mail.python.org/pipermail/python-list/2001-July/699176.html,其中第 2 点和第 4 点与我的问题相关。

假设我有一个巨大的 settings.py 并且在我的 Django 代码中,我只需要在一个很少调用的方法中使用像 MEDIA_ROOT 这样的“低级”常量。因此,导入整个 settings.py 似乎非常浪费:

from django.conf import settings
...
def foo():
    my_media_root = settings.MEDIA_ROOT

当我可以只导入需要的常量时:

from settings import MEDIA_ROOT
...
def foo():
    my_media_root = MEDIA_ROOT

因此避免导入巨大的 settings.py,尤其是因为它甚至可能永远不会被使用,如果 my_media_root 仅用于该文件中的许多方法中的一种。当然,这是不好的做法,但是“好的做法版本”是行不通的:

from django.conf.settings import MEDIA_ROOT
...
def foo():
    my_media_root = MEDIA_ROOT

因为,按照设计,它会导致预期的 ImportError: No module named settings 异常。

所以,我的问题是,从大型 settings.py 中只导入一个常量的正确方法是什么?提前致谢。

【问题讨论】:

【参考方案1】:

如果这是一个 Django 项目,那么设置文件已经被导入,你只需导入它并使用你想要的常量就不会花费任何成本。在 Python 中多次导入模块只会执行一次文件。

导入设置的常用方法:

from django.conf import settings

这只是将模块中的一个名称 (settings) 分配给现有的已导入设置对象的值。它相当于,并且执行时间大致相同:

settings = sys.modules['django.conf'].settings

你有没有发现用简单的方法做的问题?

【讨论】:

是的。否则会进行大量过早优化。

以上是关于导入单个 Django 设置常量以避免完整设置导入开销的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

Django 无法导入本地设置

django.conf.settings 和导入设置有啥区别吗?

使用 DJANGO_SETTINGS_MODULE 时如何导入设置?

在 Django 中导入设置

Heroku 上的 Django 部署,升级到 Cedar-14,导入设置错误

在 Django 2.2 中为 GRAPHENE 设置“SCHEMA”导入模块时出现问题