возникли проблемы с переадресацией - PullRequest
1 голос
/ 31 июля 2011

Я использую Django nonrel с App Engine и у меня проблема с перенаправлениями.

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

@login_required
def dashboard(request):

    if check_if_user_needs_to_import(request.user):

        return redirect("user_welcome")

Не правильно перенаправляет в App Engine, а возвращает это сообщение в браузере:

Статус: 302 НАЙДЕНО Изменяется: Cookie Тип содержимого: text / html; charset = utf-8 Местоположение: http://site.appspot.com/user/welcome/

Если я снова ввожу URL-адрес в браузере вручную, он загружается просто отлично. Это кажется проблемой только при использовании функции redirect (), любое представление с использованием render_to_response () работает нормально.

Дополнительная информация: Я пробовал как перенаправление ('name_of_view') - которое будет вызывать обратный поиск URL, так и перенаправление ('/ path / to / url /'), которое должно быть разрешено функцией redirect (), которая является родной для Джанго.

Оба случая не работают

Ответы [ 3 ]

3 голосов
/ 01 августа 2011

Похоже, что вы выводите текст в ответ, прежде чем Django отправит свой собственный ответ. Проверьте свой код на наличие операторов print - скорее всего, вы вызываете print, чего вам никогда не следует делать в приложении WSGI. Вывод из print отправляется перед любым выводом из вашего приложения Django и, таким образом, обрабатывается как начало ответа. Заголовки, отправленные Django, вместо этого получают вывод в тело.

0 голосов
/ 16 сентября 2011

У меня была похожая проблема, и я наконец нашел причину.

В какой бы функции перенаправления вы не использовали, вам нужно убедиться, что напечатанный вывод имеет вид

"Статус: 302 найдено \ nРасположение: http://www.someurl.com\n\n"

Без двух разрывов строки "\ n \ n" в конце ваше перенаправление будет НЕ работать в работе (хотя оно будет работать на сервере разработки).

Что касается комментария Ника: это правда, что вы должны полагаться на свою инфраструктуру, а не использовать sys.stdout.write или print для вывода своих собственных вещей. Тем не менее, некоторые люди любят иметь четкое (низкоуровневое) понимание того, что происходит под крючком, и создание собственного маленького CGI иногда необходимо для конкретных нужд. Но, как сказал Ник, смешивание отпечатков и фреймворка в одно и то же время, очевидно, приведет к серьезным проблемам: -)

0 голосов
/ 31 июля 2011

Хорошо, несколько вещей, которые могут помочь:

  1. Это происходит в нескольких браузерах?HTTP-статус 302 - это правильный статус для перенаправления. Возможно, у вас включен какой-либо режим отладки / аддон, который меняет способ обработки вашим браузером?.

  2. Есть ли причинавы используете относительный путь URL?Почему бы не использовать что-то вроде:

return redirect('/user_welcome')

...