在 Django 视图中有效地导入模块

Posted

技术标签:

【中文标题】在 Django 视图中有效地导入模块【英文标题】:Efficiently importing modules in Django views 【发布时间】:2010-11-10 04:30:08 【问题描述】:

我想知道 - 人们如何处理在 django 视图中导入大量常用模块?什么是有效地做到这一点的最佳方法?

例如,我有一些观点,例如,

admin_views.py
search_views.py
.
.

据我所见,他们每个人都需要使用 HttpResponse 或其他此类常用模块。此外,其中一些需要 BeautifulSoup 之类的东西,而另一些则需要其他东西(md5、auth 等)。

我在开始这个项目时所做的是创建一个 include_all.py ,其中包含我的大部分常见导入,然后在 view 本身中添加这些特定的东西。所以,我有类似的东西,

admin_views.py

from include_all import *
... 
[list of specific module imports for admin]
...

search_views.py

from include_all import *
... 
[list of specific module imports for search]
...

随着时间的推移,include_all 变成了一个 misc 文件,其中包含任何需要的东西 - 结果,许多视图最终导入了它们不需要的模块。

这会影响效率吗?也就是说,python(django?)是否将所有模块导入一次并存储/缓存它们,以便任何其他需要它们的视图不必再次导入它?还是我调用这个长文件的方法效率很低 - 我最好坚持在每个视图中单独导入这些模块?

这类事情也有最佳实践吗?

谢谢!

【问题讨论】:

【参考方案1】:

Python 本身保证一个模块只加载一次(除非显式调用reload,这里不是这种情况):第一次之后,该模块的import 只是直接从sys.modules[themodulename] 绑定它的名称, 一个极快的操作。所以Django不需要做任何进一步的优化,你也不需要。

最佳做法是在生产代码中避免使用from ... import *(使每个名称的来源更清晰、更易于维护,便于测试等)并导入模块,正如您所说的那样,“单独”,确切地说是它们的位置需要重新(通过可能绑定更少的名称可以节省几微秒并且绝对不会浪费任何名称,但是“显式优于隐式”——清晰度、可读性、可维护性——无论如何都是主要考虑因素)。

【讨论】:

啊,这是我要问的另一个后续问题 - 特别是使用 from ... * 和 import *.. 谢谢!【参考方案2】:

我想你可以将你经常使用的导入添加到你的 __init__.py 文件中。

【讨论】:

【参考方案3】:

Django 不是 CGI(或 php)。您的应用程序是一个(或几个)长时间运行的 Python 进程。不管启动需要多长时间,每个 HTTP 请求都会简单地调用您(已经加载的)视图函数。

【讨论】:

以上是关于在 Django 视图中有效地导入模块的主要内容,如果未能解决你的问题,请参考以下文章

Django中的Python路径不一致-双模块导入

django 类视图

从模块中动态导入所有内容 ( * )

django中的python模块未正确导入

python的Django views 文件中引入模块问题

如何将 python 函数从另一个文件导入 django 视图