2009-07-13 45 views
3

我想知道 - 人们如何处理在django视图中导入大量常用模块?而最有效的方法是什么?在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?)会导入所有模块一次并存储/缓存它们,以便需要它们的任何其他视图不必再次导入它?或者,我调用这个长文件的方法是非常低效的 - 我最好坚持在每个视图中单独导入这些模块?

这种事情是否有最佳做法呢?

谢谢!

回答

6

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

最好的做法是在生产代码中避免from ... import *(使其更清晰,更易于维护,每个名称都来自于,方便测试等)和导入模块。 (通过可能绑定较少的名称,可以节省几微秒,绝对不会浪费任何东西,但“显式优于隐式” - 清晰性,可读性,可维护性 - 无论如何都是主要考虑因素)。

+0

啊,这是另一个后续问题,我要问 - 特别是使用从... *和进口* ..谢谢! – viksit 2009-07-13 03:26:51

+0

@viksit,不客气! – 2009-07-13 03:34:38

0

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

0

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