在Django视图中高效导入模块

3 投票
3 回答
4089 浏览
提问于 2025-04-15 12:51

我在想,大家是怎么在 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 文件变成了一个杂项文件,里面放了各种需要的东西,结果导致很多视图导入了它们其实并不需要的模块。

这样会影响效率吗?也就是说,Python(Django?)会一次性导入所有模块并存储/缓存起来,这样其他需要这些模块的视图就不需要再导入了吗?还是说我这种调用长文件的方法效率很低,应该在每个视图中单独导入这些模块?

有没有什么最佳实践可以参考呢?

谢谢!

3 个回答

0

Django 不是 CGI(也不是 PHP)。你的应用其实是一个(或者几个)长时间运行的 Python 进程。启动的时间长短并不重要,因为每次 HTTP 请求都会直接调用你已经加载好的视图函数。

0

我想你可以把常用的导入语句放到你的 __init__.py 文件里。

6

Python保证每个模块只会被加载一次(除非你明确调用了reload,但在这里并不是这种情况):第一次加载后,后续的import操作会直接从sys.modules[模块名]中获取模块,这个过程非常快。所以Django不需要做额外的优化,你也不需要。

最佳实践是避免在生产代码中使用from ... import *(这样可以让代码更清晰,更容易维护,方便测试等等),而是应该在需要的地方“单独”导入模块(这样可以减少绑定的名称,可能节省一些微秒,绝对不会浪费时间,但“明确总比隐含好”——清晰性、可读性和可维护性才是最重要的考虑因素)。

撰写回答