我正在研究Django项目,并尝试为我在其中创建的应用设置URLConf。(您真的不需要了解Django就能了解我的问题)
这是我项目的相关部分
/PROJECT
__init__.py
settings.py
urls.py
/home
__init__.py
views.py
/user
__init__.py
views.py
我试图进口home
来自PROJECT/urls.py
:
PROJECT/urls.py (relevant parts)
from django.conf.urls import url, include
from django.contrib import admin
import user
import home # <---
urlpatterns = [
url(r'^$', home.views.index, name='index'), # <---
url(r'^register/$', user.views.register, name='register'),
url(r'^login/$', user.views.login, name='login'),
url(r'^logout/$', user.views.logout, name='logout'),
]
出于某种原因,导入user
确实起作用,而导入home
(及其子模块)不起作用。
当我运行Django的内置Web服务器时,出现以下错误:
AttributeError: module 'home' has no attribute 'views'
我在导入及其子模块时未收到此错误user
我要指出的是,当我运行urls.py
在一个普通的Python壳它有两个导入错误回来home
和user
,虽然只是home
错误,当我运行Django的网络服务器。在user
我的代码部分已经运行良好,从一开始,我假设是错误在一个正常的外壳,因为它是不应该自己运行。
同样,出于某种原因,尽管它们之间没有明显的区别,但我无法user
正确地导入,而正确地home
却不能导入。
这是在Python 3.5.1和Django 1.9中
用这个:
import home.views
当您使用Python导入软件包时,它不会递归地导入其中包含的所有子软件包或模块。
import user
起作用的原因并不明显,但这可能是因为您正在中导入视图user/__init__.py
。除非如此,否则另一个模块也有可能user.views
在url
调用之前被导入之前导入。这使得Python在事后将views
模块插入到user
包的名称空间中。
考虑以下示例:
/tmp/importtest $ mkdir mod_a mod_b
/tmp/importtest $ touch mod_{a,b}/__init__.py
/tmp/importtest $ echo 'A=1' > mod_a/a.py
/tmp/importtest $ echo 'B=2' > mod_b/b.py
/tmp/importtest $ echo 'import mod_b.b' > mod_c.py
/tmp/importtest $ python
Python 3.4.3 (default, Jan 4 2016, 22:02:53)
[GCC 4.9.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mod_a, mod_b
>>> mod_a.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'a'
>>> mod_b.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'b'
>>> import mod_c
>>> mod_b.b
<module 'mod_b.b' from '/tmp/importtest/mod_b/b.py'>
>>> mod_a.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'a'
>>>
如您所见,在导入之前mod_c
,内部没有任何内容mod_b
,但是一旦mod_c
导入便进行了更改,因为它具有将b
对象插入的名称空间的副作用mod_b
。
这使它更清晰了吗?
总之,如果您要访问user.views
或home.views
,请始终导入user.views
,home.views
而不是仅导入顶层程序包,并希望其他事情恰好会产生正确的效果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句