Джанго: нельзя импортировать имя - PullRequest
8 голосов
/ 09 марта 2011

Я только что столкнулся с очень раздражающей проблемой при развертывании новых обновлений на моем сайте. У меня есть два отдельных сайта, в то время как один из них является версией для разработчиков. Теперь, когда я хочу применить свои изменения к продукту, он не будет работать из-за сообщения об ошибке:

Файл "/Usr/lib/python2.6/dist-packages/django/core/handlers/base.py", строка 99, в get_response
request.path_info)

Файл "/Usr/lib/python2.6/dist-packages/django/core/urlresolvers.py", строка 249 в разрешении для шаблона в self.url_patterns:

Файл "/Usr/lib/python2.6/dist-packages/django/core/urlresolvers.py", строка 278, в _get_url_patterns
шаблоны = GetAttr (self.urlconf_module, "urlpatterns", self.urlconf_module)

Файл "/Usr/lib/python2.6/dist-packages/django/core/urlresolvers.py", строка 273, в _get_urlconf_module
self._urlconf_module = import_module (self.urlconf_name)

Файл "/Usr/lib/python2.6/dist-packages/django/utils/importlib.py", строка 35, в import_module
импорт (имя)

Файл "/Srv/websites/spelutveckla_se/urls.py", строка 21, в
(Г '^ аккаунт / Войти / $', LoginView.as_view ()), * 1 021 *

NameError: имя 'LoginView' не является определены

Не имеет значения, удаляю ли я это приложение, представление, класс или модуль, потому что вместо этого он будет жаловаться на другой модуль. LoginView определяется в операторе импорта. Эти файлы являются просто свежей копией файлов разработки (за исключением settings.py), которая без проблем работает на другом поддомене. Я проверил settings.py несколько раз и убедился, что установлены правильные настройки (отличается парой путей к каталогам). Я также проверил, что пользователь www-данных apache2 имеет разрешение на доступ к файлам. Я также несколько раз перезагружал 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 голосов
/ 09 марта 2011

Скорее всего, у вас был циклический импорт в модуле, в котором был определен LoginView, т.е. когда вы импортировали модуль views, который определил LoginView, некоторые операторы каким-то образом в свою очередь импортировали какой-то другой модуль, который все еще ждалполучить полную интерпретацию.

Вот пример, чтобы дать вам лучшее представление:

# 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') будетвыполнить, и ваш myapp.urls будет в конечном итоге импортирован Django, только это никогда не будет возможно, так как myapp.urls будет бесконечно ждать, пока myapp.views будет импортирован.

...