2012-09-07 14 views
5

Desde mi aplicación Django, ¿cómo puedo redirigir a un usuario a somescheme: //someurl.com?Django redirige a la URL personalizada

Para darle contexto en caso de que sea útil, tengo un servidor oauth2 en funcionamiento escrito en Python/Django y necesito permitir que los usuarios registren redirect_uris que tengan un esquema de URL personalizado. Este esquema de URL personalizado se utiliza para handling the redirect within native apps.

Mi primera reacción fue utilizar un HttpResponseRedirect, pero esta URL tiene un esquema personalizado y no es HTTP, así que supongo que esto no es lo que quiero. Gracias de antemano por cualquier consejo que pueda dar.

Edit: Lo intenté y Django devuelve la respuesta redirigir correctamente sin arrojar un error, pero el navegador no redirige a esta URL. Estoy usando Chrome para probar esto.

Editar 2: HttpResponseRedirect funciona bien en safari.

+1

¿Lo ha probado? La respuesta de redirección se remonta al cliente, por lo que podría funcionar. – zmbq

Respuesta

4

clase HttpResponseRedirect

Se requiere que el primer argumento del constructor - el camino para volver a dirigir a. Esta puede ser una URL totalmente calificada (por ejemplo, 'http://www.yahoo.com/search/') o una ruta absoluta sin dominio> (por ejemplo, '/ buscar /'). Vea HttpResponse para otros argumentos de constructor opcionales. Nota> que este devuelve un código de estado HTTP 302.

Esto es de aquí: https://docs.djangoproject.com/en/dev/ref/request-response/

Se debe trabajar todos modos de lo que estoy leyendo.

+0

Sí, la redirección funciona bien en Safari. ¡Gracias! – Spike

16

En realidad, esto no debería trabajo como Django es que sólo permite redirecciones a http, https y ftp por defecto por razones de seguridad:

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

que estaba teniendo el mismo problema con OAuth y redirigir la costumbre esquemas.
Django (en Apache) está lanzando 500 (django.core.exceptions.SuspiciousOperation) al redirigir a esquemas personalizados. La solución es crear su propia subclase HttpResponseRedirect o simplemente hacer:

location = < your redirect URL > 
res = HttpResponse(location, status=302) 
res['Location'] = location 
return res 
+0

¡Gracias por el aviso! No lo he probado todavía, pero lo marcaré correctamente si lo hago y funciona. Estaba en Django 1.4.0 y probablemente por eso no noté este problema. – Spike

+0

funciona como un encanto, perfecto para proyectos internos/cerrados. – Thomas

+0

Solo para agregar a esto, encontré (para Django 1.6), que si subclasifica 'HttpResponseRedirect' también necesita agregar su protocolo personalizado a la variable de clase' allowed_schemes'; de lo contrario, Django levantará 'SuspiciousOperation' –

Cuestiones relacionadas