我当前正在使用以下功能来获取引用视图:
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
[如果由于编程逻辑,例如,我将view
重定向了...
return HttpResponseRedirect('dashboard')
...是否有一种无需使用HTTP_REFERER
即可获取引用视图的方法,以便可以在重定向的view
中使用该变量?并非总是在浏览器的标题中设置。
注意,因为视图是按语法重定向的,所以我不能使用POST来收集数据。
也许可以通过某种方式设置和检索自定义标头?
https://docs.djangoproject.com/en/3.0/topics/http/middleware/
类似这样的方法应该起作用:
class HTTPReferer:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
referer = request.META.get('HTTP_REFERER', None)
request.referer = referer
# other business logic as you like it
response = self.get_response(request)
return response
因此,您可以将所需的任何信息绑定到Django中的每个请求/响应周期(您还可以设置自定义标头,等等。)在以上示例中,
HTTP_REFERER
将在请求对象中以referer
的形式提供。
所以代替这个:
def current_view():
...
return HttpResponseRedirect('dashboard')
做这样的事情:
def current_view(): ... response = redirect('/dashboard') response['source-view'] = request.resolver_match.view_name return response
这将产生带有自定义标头source-view
的302,您可以在接收视图中提取它
from django.http import HttpResponse
def index(request):
response = HttpResponse("Hello world!")
response["My-Header"] = "header value"
return response
您将获得:
200 OK Content-Type: text/html; charset=utf-8 Date: Mon, 22 Aug 2016 10:56:34 GMT Server: WSGIServer/0.1 Python/2.7.10 My-Header: header value X-Frame-Options: SAMEORIGIN Hello world!