Actualmente estoy usando la siguiente función para obtener una vista de referencia:
def get_referer_view(request, default=None):
referer = request.META.get('HTTP_REFERER')
if not referer:
return default
# remove the protocol and split the url at the slashes
referer = re.sub('^https?:\/\/', '', referer).split('/')
if referer[0] != request.META.get('SERVER_NAME'):
return default
# add the slash at the relative path's view and finished
referer = u'/' + u'/'.join(referer[1:])
return referer
Si redirigí el view
como resultado de la lógica programática, por ejemplo ...
return HttpResponseRedirect('dashboard')
... ¿hay alguna manera de obtener la vista de referencia sin usar HTTP_REFERER
para poder usar esa variable en el redireccionado view
? Esto no siempre se establece en los encabezados del navegador.
Tenga en cuenta que debido a que las vistas se redirigen programáticamente, no puedo usar POST para recopilar los datos.
¿Quizás es posible establecer y recuperar un encabezado personalizado de alguna manera?
django
django-views
django-urls
alias51
fuente
fuente
?came_from=inbox
. Linked, Facebook, otros parecen hacerlo, por lo que debería ser una buena práctica.HttpResponseRedirect
no es realmente programático: devuelve la respuesta http 302 real y obliga al navegador a hacer una nueva solicitud a la nueva URL de la vista a la que se está redirigiendo ...Respuestas:
Use el componente de middleware de Django.
https://docs.djangoproject.com/en/3.0/topics/http/middleware/
Algo como esto debería funcionar:
Por lo tanto, puede vincular cualquier información que necesite a cada ciclo de solicitud / respuesta en Django (también puede configurar encabezados personalizados, etc.)
En el ejemplo anterior
HTTP_REFERER
estará disponible en el objeto de solicitud comoreferer
.EDITAR: Creo que su preocupación es que
HTTP_REFERER
no siempre está poblada por el cliente; para que pueda vincular HttpRequest.path a cada solicitud realizada a un encabezado personalizado. Si la ruta no es suficiente, también puede guardar los argumentos de la solicitud. Eso es todo, creo. Luego tiene un encabezado personalizado poblado por la última ruta. Más adelante, si esto no es suficiente, puede usar el solucionador de URL de Django .fuente
Como controlas la página que realiza la solicitud, seguro. Agregue la URL actual a algún encabezado y extráigala en su función, similar a esto: Agregue el encabezado de solicitud antes de la redirección
así que en lugar de esto:
haz algo como esto:
Esto debería producir el 302 con el encabezado personalizado
source-view
, que puede extraer en la vista de recepciónfuente
Para aquellos interesados, aquí está la solución que obtuve. El truco consiste en establecer una cookie después de la primera solicitud para almacenar el
view_name
opath
y luego llamarlo y guardarlorequest
antes de mostrar la vista.Los valores se actualizan en este ciclo cada vez que se cambia la vista.
fuente