【问题标题】:How to detect redirection in Django view如何在 Django 视图中检测重定向
【发布时间】:2019-12-20 22:13:18
【问题描述】:

我有一个返回重定向的视图。

return redirect(reverse('my-view-name'))

这是一种在视图方法中检测重定向的方法吗?

我搜索了request 对象属性,但找不到任何指示重定向的属性。

【问题讨论】:

  • 您检查响应对象,这就是您在此处返回的内容:带有302 状态码的响应对象。
  • 您在哪里尝试检测重定向?在您重定向到的my-view-name 中?当你检测到重定向时你想做什么?

标签: python django http-redirect


【解决方案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(..)的情况下进行。

【讨论】:

    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多