导入视图与从 .导入视图
import views vs from . import views
我是 Python 和 Django 的新手,我有一个名为 calc
的应用程序目录,里面有两个文件:
views.py
urls.py
在urls.py
中,如果我输入import views
,服务器会产生一个错误,但是如果我输入from . import views
,一切正常。有人可以解释为什么吗?我认为由于两个 py 文件直接在同一个文件中,所以 import 语句应该匹配 views.py
答案很简单。默认情况下,如果你 import everything
,你是从标准的 pythonish 库中导入它。如果将其扩展为 from everything.something import anything
,它会检查以 app everything
模块开头的路径。如果不成功,它还会尝试寻找全局。
在你的例子中,它在同一个文件夹(从 .
开始)中寻找模块 views
,这不是全局包,所以它不能通过简单的 import views
.
由于您的文件在 calc
模块中,因此您必须使用 import calc.views
,而不是 import views
。
然后您可以将某些 view
函数 some_func
称为 calc.views.some_func
。
或者你可以做import calc.views as views
,然后你可以将函数引用为views.some_func
,就像你使用from . import views
时一样。
您必须在 import calc.views
中包含 calc
前缀的原因是因为这被认为是“绝对导入”,并且 calc
本身不在您的 $PYTHONPATH
中——它的父目录是。
无论如何,您最好坚持使用 from . import views
(称为“相对导入”)。
我是 Python 和 Django 的新手,我有一个名为 calc
的应用程序目录,里面有两个文件:
views.py
urls.py
在urls.py
中,如果我输入import views
,服务器会产生一个错误,但是如果我输入from . import views
,一切正常。有人可以解释为什么吗?我认为由于两个 py 文件直接在同一个文件中,所以 import 语句应该匹配 views.py
答案很简单。默认情况下,如果你 import everything
,你是从标准的 pythonish 库中导入它。如果将其扩展为 from everything.something import anything
,它会检查以 app everything
模块开头的路径。如果不成功,它还会尝试寻找全局。
在你的例子中,它在同一个文件夹(从 .
开始)中寻找模块 views
,这不是全局包,所以它不能通过简单的 import views
.
由于您的文件在 calc
模块中,因此您必须使用 import calc.views
,而不是 import views
。
然后您可以将某些 view
函数 some_func
称为 calc.views.some_func
。
或者你可以做import calc.views as views
,然后你可以将函数引用为views.some_func
,就像你使用from . import views
时一样。
您必须在 import calc.views
中包含 calc
前缀的原因是因为这被认为是“绝对导入”,并且 calc
本身不在您的 $PYTHONPATH
中——它的父目录是。
无论如何,您最好坚持使用 from . import views
(称为“相对导入”)。