NoReverseMatch происходит в любом исключении - PullRequest
0 голосов
/ 27 августа 2018

Я использую django-framework.Возникает вопрос, что какое бы исключение не происходило в программе, оно будет вызывать NoReverseMatch (например, я вставил «a = 1/0» в код моего представления).

Ниже приведен мой Traceback:

  File "/usr/lib/python3.5/wsgiref/handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "/usr/local/lib/python3.5/dist-packages/django/contrib/staticfiles/handlers.py", line 66, in __call__
    return self.application(environ, start_response)
  File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/wsgi.py", line 146, in __call__
    response = self.get_response(request)
  File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", line 81, in get_response
    response = self._middleware_chain(request)
  File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py", line 37, in inner
    response = response_for_exception(request, exc)
  File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py", line 87, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py", line 122, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/usr/local/lib/python3.5/dist-packages/django/views/debug.py", line 91, in technical_500_response
    text = reporter.get_traceback_text()
  File "/usr/local/lib/python3.5/dist-packages/django/views/debug.py", line 341, in get_traceback_text
    return t.render(c)
  File "/usr/local/lib/python3.5/dist-packages/django/template/base.py", line 175, in render
    return self._render(context)
  File "/usr/local/lib/python3.5/dist-packages/django/template/base.py", line 167, in _render
    return self.nodelist.render(context)
  File "/usr/local/lib/python3.5/dist-packages/django/template/base.py", line 943, in render
    bit = node.render_annotated(context)
  File "/usr/local/lib/python3.5/dist-packages/django/template/base.py", line 910, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.5/dist-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/usr/local/lib/python3.5/dist-packages/django/template/base.py", line 910, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.5/dist-packages/django/template/base.py", line 993, in render
    output = self.filter_expression.resolve(context)
  File "/usr/local/lib/python3.5/dist-packages/django/template/base.py", line 703, in resolve
    new_obj = func(obj, *arg_vals)
  File "/usr/local/lib/python3.5/dist-packages/django/template/defaultfilters.py", line 229, in stringformat
    return ("%" + str(arg)) % value
  File "/usr/local/lib/python3.5/dist-packages/django/utils/functional.py", line 79, in __repr__
    return repr(self.__cast())
  File "/usr/local/lib/python3.5/dist-packages/django/utils/functional.py", line 124, in __cast
    return self.__text_cast()
  File "/usr/local/lib/python3.5/dist-packages/django/utils/functional.py", line 112, in __text_cast
    return func(*self.__args, **self.__kw)
  File "/usr/local/lib/python3.5/dist-packages/django/urls/base.py", line 86, in reverse
    raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'promotions' is not a registered namespace
[2018-08-27 11:37:56,758] [ERROR] "POST /v1/voucher/ HTTP/1.1" 500 59

Примечания: трассировка будет печатать время сервировки, и между ними будет напечатана истинная ошибка.

Follwing - это мой urls.config

router = DefaultRouter()
router.register('address', AddressViewset, base_name="address")
router.register('category', CategoryViewset, base_name='Category')
router.register('product', ProductViewset, base_name='product')
router.register('history', UserProductViewset, base_name='browsehistory')
router.register('order', OrderViewset, base_name='order')
router.register('voucher', VoucherViewset, base_name='voucher')

urlpatterns = [

    path('admin/', admin.site.urls),
    url('v1/', include(router.urls)),
    url('v1/login/', include('login.urls')),

]

Следуйте - мой INSTALLED_APPS:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django.contrib.flatpages',
'rest_framework',
'rest_framework.authtoken',
'django_filters',
'compressor',
'widget_tweaks',
'login.apps.LoginConfig',
] + get_core_apps(['catalogue', 'address', 'voucher', 'order', 'analytics', 
'offer', 'wishlists', 'dashboard'])

get_core_apps - это функция django-oscar.

Я продолжаю копаться и использую pdb в строке 75 django / urls / base.py, где начинается ошибка.

Follwing - это фрагмент кода:

    import pdb
    pdb.set_trace()
    extra, resolver = resolver.namespace_dict[ns]
    resolved_path.append(ns)
    ns_pattern = ns_pattern + extra
    ns_converters.update(resolver.pattern.converters)

И я печатаю некоторую переменную

  • ns: 'promotions'
  • resolver.namespace_dict: {'admin': ('admin \ /', (admin: admin) 'admin /'>)}

Чтобы подвести итог, когда возникает ошибка, django хочет найти функцию просмотра для URL "home: promotions", но это не может, и я проверил все места, где происходит «дом: продвижение» (что показано в коде Django-Оскар, но не мой), программа также не коснуласьЯ думаю, что самое важное - выяснить, какая строка вызывает reverse () для «home: prmotions», как это отладить.

1 Ответ

0 голосов
/ 05 сентября 2018

Я нахожу причину.Сначала я помещаю pdb в url / base.py, и получаю сообщение об ошибке, которое называется "продвижение: дом". Затем я ищу его во всем моем проекте и django-oscar. Он присваивается глобальной переменной:

OSCAR_HOMEPAGE = reverse_lazy('promotions:home')

Когда я комментирую это, сообщение об ошибке

...