导入单个 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.conf.settings 和导入设置有啥区别吗?
使用 DJANGO_SETTINGS_MODULE 时如何导入设置?