在Django视图中高效导入模块
我在想,大家是怎么在 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 个回答
Django 不是 CGI(也不是 PHP)。你的应用其实是一个(或者几个)长时间运行的 Python 进程。启动的时间长短并不重要,因为每次 HTTP 请求都会直接调用你已经加载好的视图函数。
我想你可以把常用的导入语句放到你的 __init__.py 文件里。
Python保证每个模块只会被加载一次(除非你明确调用了reload
,但在这里并不是这种情况):第一次加载后,后续的import
操作会直接从sys.modules[模块名]
中获取模块,这个过程非常快。所以Django不需要做额外的优化,你也不需要。
最佳实践是避免在生产代码中使用from ... import *
(这样可以让代码更清晰,更容易维护,方便测试等等),而是应该在需要的地方“单独”导入模块(这样可以减少绑定的名称,可能节省一些微秒,绝对不会浪费时间,但“明确总比隐含好”——清晰性、可读性和可维护性才是最重要的考虑因素)。