Django 的views.py 中应该在哪里导入? [复制]

Posted

技术标签:

【中文标题】Django 的views.py 中应该在哪里导入? [复制]【英文标题】:Where should imports be in Django's views.py? [duplicate] 【发布时间】:2016-09-22 22:10:19 【问题描述】:

关于网络应用程序的最少运行时间,将我的导入保存在 views.py 中的理想位置是什么

假设我想使用外部模块验证和处理一些表单条目。我当前的代码:

from django.shortcuts import render

from .forms import *

import re
import module1
import module2

def index(request):
    form = MyForm()
    if request.method == 'POST':
        form = MyForm(request.POST)

        if form.is_valid():
            #
            #Process my stuff here using re, module1, module2
            #

return render(request, 'index.html', context)

但是,如果条件if form.is_valid(): 失败,提前导入模块 re、module1、module 2 有什么好处?或者条件if request.method == 'POST': 失败?那是表单从未提交的时候。

在满足这些条件后导入这些模块(因为那是实际需要它们的时候)在这些条件失败时会导致程序或 webapp 的运行时开销减少吗?在不需要时避免不必要的导入?

我的想法的伪代码:

if form.is_valid():
    import re
    #Perform some regex matches and stuff
    if (above re matches succeed):
        import module1
        #Process my stuff here using module1 here
        #and so on importing modules only when they are required

其中哪一项是推荐的,并且在网站上表现最好?

【问题讨论】:

【参考方案1】:

不要这样做。

没有理由在这样的代码中间导入。导入只进行一次;因为几乎可以肯定,在某些时候您的代码将遵循 is_valid 路径,您将需要该导入,因此在此之前推迟导入没有任何好处。

事实上,这可能会使其性能降低;而不是在进程启动时完成所有导入,而是在某人的请求中间进行。

但无论哪种方式,差异都可以忽略不计。为了便于阅读,请将您的导入放在它们所属的位置,在顶部。

【讨论】:

谢谢,我不知道这里的内部工作原理,但是当用户单击表单上的提交按钮时不会再次执行导入吗?是不是又调用了views.py? 是的,视图 function 再次被调用。但这不会触发再次进行导入;它们对文件是全局的。即使是这样,Python 也不会在已经导入模块时重新导入它。 谢谢,这让事情变得很清楚。【参考方案2】:

文件顶部的导入模块完全没问题,这样做是recommended way。

它不会增加任何运行时开销,因为导入只完成一个,而不是在每个请求中完成(就像在 php 中一样)。

【讨论】:

以上是关于Django 的views.py 中应该在哪里导入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Django视图层(views.py)

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

Django学习路3

如何在 django 中声明一个数据库驱动的字典,该字典可在模板中全局访问,而不依赖于 views.py

Python函数导入在Django中不起作用

使用JavaScript Onclick Event将数据传递给Django中的views.py?