Django:无法导入名称

8
我刚在部署网站新更新时遇到了一个非常烦人的问题。我有两个不同的网站,其中一个是开发版本。现在当我想将更改应用到生产环境时,由于错误消息,它无法正常工作:
``` File "/usr/lib/python2.6/dist-packages/django/core/handlers/base.py", line 99, in get_response request.path_info) File "/usr/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 249, in resolve for pattern in self.url_patterns: File "/usr/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 278, in _get_url_patterns patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) File "/usr/lib/python2.6/dist-packages/django/core/urlresolvers.py", line 273, in _get_urlconf_module self._urlconf_module = import_module(self.urlconf_name) File "/usr/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module __import__(name) File "/srv/websites/spelutveckla_se/urls.py", line 21, in (r'^account/login/$', LoginView.as_view()), NameError: name 'LoginView' is not defined ```
即使我删除该应用程序、视图、类或模块,也没有关系,因为它会抱怨另一个模块。 LoginView在导入语句中被定义。这些文件只是开发文件的新副本(除了settings.py),而在另一个子域上运行,没有任何问题。我已经多次检查了settings.py,并确保设置了正确的设置(差几个目录路径)。我还检查了apache2 www-data用户是否有权限访问文件。我也多次重新启动了apache并反复复制了文件,但仍然无法解决。
我很绝望,不知道问题可能是什么...?
这是我的urls.py开头部分:
from django.conf.urls.defaults import *
from django.conf import settings
from django.views.generic import DetailView, ListView, TemplateView
from django.contrib import admin
from project.models import Project
from project.views import Detail, EditView as EditProject, CreateProjectView, EditProjectLinksView, EditProjectFeedsView, EditProjectTagsView, EditMultimediaView, PostForumTopic, AudioFormset
from frontpage.views import FrontpageView
from userprofile.views import UserRegistrationView, UserRegistrationActivationView, LogoutView, UserProfileView, LoginView, EditProfileView, CreateUserProfileView
from registration.views import activate as UserActivatedView
1个回答

22

很可能在定义LoginView的模块中发生了循环导入,也就是说,在导入定义了LoginViewviews模块时,某个语句又以某种方式导入了某个仍在等待完全解释的其他模块。

以下示例可帮助您更好地理解:

# myapp.urls

from django.conf.urls.defaults import *
from myapp import views

urlpatterns = patterns('',
    # ...
)

# myapp.views

from django.core.urlresolvers import reverse
from django.views.generic.edit import CreateView

class SomeCreateView(CreateView):

    # BOOM!
    success_url = reverse('myapp:some-url')

当导入myapp.views并将SomeCreateView类型分配到内存中时,reverse('myapp:some-url')将被执行,Django最终将导入您的myapp.urls,但这是不可能的,因为myapp.urls将无限期地等待myapp.views被导入。


我在Staging和Production环境中遇到了类似的问题。在Staging上,当我第一次运行时,会出现“Error: cannot import name Cart”的错误。然后经过几次页面刷新后,一切都开始正常工作。在Production上没有发生这样的事情。但问题仍然存在,我无法在Staging上运行./manage.py命令,因为它不断地给我报错。 - kravc
尝试删除所有的pyc文件。 - elad silver
谢谢你指出了我遇到的确切问题。我的模型中定义了一个作为类变量的“reverse” URL。我一直在寻找循环导入,而不是像这样的其他奇怪情况。你刚刚帮我节省了很多时间。 - Rebs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接