3

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

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

admin_views.py
search_views.py
.
.

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

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

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 变成了一个杂项文件,其中包含了任何需要的东西——结果,许多视图最终导入了他们不需要的模块。

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

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

谢谢!

4

3 回答 3

6

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

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

于 2009-07-13T02:14:18.020 回答
0

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

于 2009-07-13T02:14:45.227 回答
0

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

于 2009-07-13T03:01:43.090 回答