Django перенаправляет на пользовательский URL

Как перенаправить пользователя из моего приложения Django на somescheme://someurl.com?

Чтобы дать вам некоторый контекст на случай, если это поможет, у меня есть работающий сервер oauth2, написанный на Python/Django, и мне нужно разрешить пользователям регистрировать redirect_uris, которые имеют собственную схему URL. Эта настраиваемая схема URL используется для обработка перенаправления в нативных приложениях.

Моей первой реакцией было использовать HttpResponseRedirect, но этот URL-адрес имеет пользовательскую схему и не является HTTP, поэтому я предполагаю, что это не то, что мне нужно. Заранее спасибо за любой совет, который вы можете дать.

Изменить: я пробовал это, и Django правильно возвращает перенаправление ответа, не выдавая ошибку, но браузер не перенаправляет на этот URL-адрес. Я использую Chrome, чтобы проверить это.

Редактировать 2: HttpResponseRedirect отлично работает в сафари.


person Spike    schedule 07.09.2012    source источник
comment
Ты это пробовал? Ответ перенаправления возвращается клиенту, поэтому он может просто работать.   -  person zmbq    schedule 08.09.2012


Ответы (2)


класс HttpResponseRedirect

Требуется первый аргумент конструктора — путь для перенаправления. Это может быть >полный URL-адрес (например, 'http://www.yahoo.com/search/') или абсолютный путь без >домена (например, '/search/'). См. HttpResponse для других необязательных аргументов конструктора. Обратите внимание, что это возвращает код состояния HTTP 302.

Это отсюда: https://docs.djangoproject.com/en/dev/ref/request-response/

Это должно работать в любом случае из того, что я читаю.

person baordog    schedule 07.09.2012

На самом деле это не должно работать, поскольку Django по умолчанию разрешает перенаправления только на http, https и ftp из соображений безопасности:

https://www.djangoproject.com/weblog/2012/jul/30/security-releases-issued/

У меня была такая же проблема с OAuth и перенаправлением на пользовательские схемы.
Django (на Apache) выдает 500 (django.core.exceptions.SuspiciousOperation) при перенаправлении на пользовательские схемы. Решение состоит в том, чтобы создать свой собственный подкласс HttpResponseRedirect или просто сделать:

location = < your redirect URL >
res = HttpResponse(location, status=302)
res['Location'] = location
return res
person Pascal    schedule 06.12.2012
comment
Спасибо за внимание! Я еще не пробовал это, но отмечу это правильно, если я это сделаю, и это сработает. Я был на Django 1.4.0, возможно, поэтому я не заметил этой проблемы. - person Spike; 06.12.2012
comment
Просто чтобы добавить к этому, я обнаружил (для Django 1.6), что если вы создаете подкласс HttpResponseRedirect, вам также необходимо добавить свой собственный протокол [s] в переменную класса allowed_schemes, иначе Django все равно будет поднимать SuspiciousOperation - person Tom Dalton; 28.11.2014