如何在 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】:

重定向仅仅意味着您返回一个带有状态代码302HttpResponseRedirect 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中自动刷新/重定向视图[重复]

如何在 Django 1.3 中使用基于类的视图重定向条件?

如何使用自定义 django 404 错误视图重定向?

如何在 Django 中使用基于类的视图将用户重定向到登录页面? [复制]

如何在 Django 中重定向到外部 URL?

Django:如何通过 AJAX 将 PKID 列表传递给下一个视图,然后重定向