Atualmente, estou usando a seguinte função para obter uma exibição de referência:
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
Se eu redirecionei o view
resultado da lógica programática, por exemplo ..
return HttpResponseRedirect('dashboard')
... existe uma maneira de obter a visualização de referência sem usar HTTP_REFERER
para que eu possa usar essa variável no redirecionado view
? Isso nem sempre é definido nos cabeçalhos do navegador.
Observe que, como as visualizações são redirecionadas de forma programática, não posso usar o POST para coletar os dados.
Talvez seja possível definir e recuperar um cabeçalho personalizado de alguma forma?
django
django-views
django-urls
alias51
fonte
fonte
?came_from=inbox
. Ligado, Facebook, outros parecem fazê-lo, por isso deve ser uma boa prática.HttpResponseRedirect
não é realmente programático - ele retorna a resposta http 302 real e força o navegador a fazer uma nova solicitação para o novo URL da exibição para a qual está sendo redirecionado ...Respostas:
Use o componente de middleware do Django.
https://docs.djangoproject.com/en/3.0/topics/http/middleware/
Algo assim deve funcionar:
Assim, você pode vincular qualquer informação necessária a cada ciclo de solicitação / resposta no Django (você também pode definir cabeçalhos personalizados, etc ...)
No exemplo acima
HTTP_REFERER
, estará disponível no objeto de solicitação comoreferer
.EDIT: Eu acho que você se preocupa é que
HTTP_REFERER
nem sempre é preenchida pelo cliente; para que você possa vincular HttpRequest.path a todas as solicitações feitas em um cabeçalho personalizado. Se o caminho não for suficiente, você também poderá salvar os argumentos da solicitação. É tudo o que eu penso. Então você tem um cabeçalho personalizado preenchido pelo último caminho. Além disso, se isso não for suficiente, você poderá usar o resolvedor de URLs do Django .fonte
Desde que você controla a página que faz a solicitação, com certeza. Adicione o URL atual a algum cabeçalho e extraia-o em sua função, semelhante a este: Adicione o cabeçalho da solicitação antes do redirecionamento
então, ao invés disso:
faça algo assim:
Isso deve produzir o 302 com o cabeçalho personalizado
source-view
, que você pode extrair na exibição de recebimentofonte
Para os interessados, aqui está a solução que eu derivei. O truque é definir um cookie após a primeira solicitação para armazenar o
view_name
oupath
e depois chamá-lo e salvar norequest
antes de renderizar a exibição.Os valores são atualizados nesse ciclo sempre que a exibição é alterada.
fonte