正确导入单个Django设置常量以避免完全设置导入开销?

Clo*_*ans 4 python django import

Django - 导入django.conf.settings和导入设置之间的区别,我理解导入设置文件的可接受方式:

from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

我还读过Python中的好或坏练习:在文件中间导入.其中一个答案将您带到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
Run Code Online (Sandbox Code Playgroud)

当我可以导入一个所需的常量:

from settings import MEDIA_ROOT
...
def foo():
    my_media_root = MEDIA_ROOT
Run Code Online (Sandbox Code Playgroud)

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

from django.conf.settings import MEDIA_ROOT
...
def foo():
    my_media_root = MEDIA_ROOT
Run Code Online (Sandbox Code Playgroud)

因为,按照设计,它会导致预期的ImportError: No module named settings例外.

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

Ned*_*der 14

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

导入设置的常用方法:

from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

这只是将module(settings)中的一个名称指定给现有已导入的设置对象的值.它相当于,并具有与以下相同的执行时间:

settings = sys.modules['django.conf'].settings
Run Code Online (Sandbox Code Playgroud)

您是否以简单的方式发现了问题?