如何在 Django 视图中检测重定向
Posted
技术标签:
【中文标题】如何在 Django 视图中检测重定向【英文标题】:How to detect redirection in Django view 【发布时间】:2019-12-20 22:13:18 【问题描述】:我有一个返回重定向的视图。
return redirect(reverse('my-view-name'))
这是一种在视图方法中检测重定向的方法吗?
我搜索了request
对象属性,但找不到任何指示重定向的属性。
【问题讨论】:
您检查响应对象,这就是您在此处返回的内容:带有302
状态码的响应对象。
您在哪里尝试检测重定向?在您重定向到的my-view-name
中?当你检测到重定向时你想做什么?
【参考方案1】:
重定向仅仅意味着您返回一个带有状态代码302
的HttpResponseRedirect
object [Django-doc] 和一个包含您重定向到的位置的标头Location
。该响应没有什么特别之处,目标视图也不是由重定向响应本身触发的。
收到此类响应的浏览器可以通过访问该链接进行操作,然后它将触发您重定向到的视图。但是浏览器本身并不会这样做(您通常可以更改一些设置以让您的浏览器(不)遵循此类重定向)。
因此,您可以例如 implement your own middleware 使用此类重定向执行某些操作:
def redirect_processing_middleware(get_response):
def middleware(request):
response = get_response(request)
if 300 <= response.status_code < 400:
# the response is a redirect
# ...
pass
return middleware
另一种方法是在redirect(..)
调用上添加一个看门狗,但这可以通过简单地创建一个HttpResponse
并手动更改该响应以将其转换为重定向响应来规避。
您可以进行一些静态代码分析(自动或手动)。但是由于 Python 的动态特性,无法确定哪些视图会触发重定向:可以通过使用代理函数等来混淆 redirect
调用,或者动态更改/猴子补丁代码以便重定向在没有(明确)调用redirect(..)
的情况下进行。
【讨论】:
以上是关于如何在 Django 视图中检测重定向的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 1.3 中使用基于类的视图重定向条件?