2015-07-15 3 views
2

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

Мне удалось заставить работать следующее. Поэтому, если 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. Как флаг «редактировать» используется для возврата другого QuerySet. например

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

И я изменил свой первоначальный код:

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

Однако этот рейз Resolver404.

Полный StackTrace здесь: 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) 

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

ответ

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.

Смежные вопросы