Django разрешает с параметрами GET — вызывает Resolver404()

Мне нужно проверить, приведет ли перенаправление к URL-адресу к ошибке 404. Следующий пример в документах django: https://docs.djangoproject.com/en/1.8/ref/urlresolvers/#resolve

Мне удалось заставить работать следующее. Поэтому, если redirect_url вызывает ошибку 404, мы перенаправляем пользователя на домашнюю страницу.

redirect_url = '/blog/hello-world'

view, args, kwargs = resolve()
kwargs['request'] = request
try:
    view(*args, **kwargs)
except Http404:
    self.message_user(...)
    return HttpResponseRedirect('/')

Однако мне нужно проверить, вызывает ли redirect_url с параметром GET ?edit также 404. Поскольку флаг «редактировать» используется для возврата другого набора запросов. например

    if 'edit' in request.GET:
        qs = qs.drafts()
    else:
        qs = qs.public()

И я изменил исходный код:

redirect_url = '%s?edit' % redirect_url
[...]

Однако при этом поднимается Resolver404.

Полная трассировка стека здесь: http://dpaste.com/1DQHH7Q

Теперь мой вопрос: как проверить ошибку HTTP404 с параметрами GET?

Путь blog/2015/07/14/sky-limit-only-those-who-arent-afraid-fly/?edit действителен, когда я перехожу по URL-адресу в браузере... он работает как положено.

Грязное решение состоит в том, чтобы сделать это:

 from django.test.client import Client

 client = Client()
 resp = client.get(redirect_url)
 if not resp.status_code == 404:
    return HttpResponseRedirect(redirect_url)

Я действительно не хочу использовать это.


person mishbah    schedule 15.07.2015    source источник


Ответы (1)


Метод resolve() принимает URL-адрес без параметров GET. Вы можете попробовать заменить request.GET.

redirect_url = '/blog/hello-world'
view, args, kwargs = resolve()
request.GET = {'edit': ''}
kwargs['request'] = request
try:
    view(*args, **kwargs)
except Http404:
    self.message_user(...)
    return HttpResponseRedirect('/')

Обратите внимание, что request — это объект запроса для вашего текущего представления, поэтому будьте осторожны, будьте осторожны, если вам нужны фактические данные request.GET.

person Alasdair    schedule 15.07.2015