【问题标题】:Django HttpResponseRedirect not working in custom permission (authentication.py)Django HttpResponseRedirect 在自定义权限中不起作用(authentication.py)
【发布时间】:2016-03-10 13:10:29
【问题描述】:

我创建了一个自定义权限来检查用户是否登录。我通过令牌检查它,如果令牌不存在,则它没有登录,因此应该重定向到主页。我已经导入了所有必要的要求,比如 HttpResponseRedirect 和其他东西。这在我的视图集中用作权限类(在某些方法中,我将响应呈现为 html 模板,而在某处呈现为 json)。代码如下:

class AccountPermission(permissions.BasePermission):
    message = "Not a valid customer"

    def has_permission(self, request, view):
        if not token:
            return HttpResponseRedirect('/')
        else:
            return True

问题是 Viewset 将来自自定义权限的 HttpResponseRedirect html 视为 True,并允许用户使用 Viewset 中的方法。如何避免这种情况?

【问题讨论】:

  • 根据the docshas_permission 方法应该返回TrueFalse。无法返回重定向响应。
  • 感谢阿拉斯代尔。你能告诉一个替代方案吗?
  • 我对rest框架不是很熟悉,所以我不知道你在哪里可以处理权限被拒绝的异常并返回重定向。

标签: python django permissions django-rest-framework


【解决方案1】:

嘿,我找到了解决方案。如果将来有人需要这个会很有帮助。我为rest框架异常创建了一个异常处理程序并在settings.py文件中启动:

REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'app_name.exception.function_name'
}

我在 exception.py 中创建了我的异常处理函数 custom_exception_handler:

from rest_framework.views import exception_handler
from django.http import HttpResponseRedirect

def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    # Now add the HTTP status code to the response.
    if response is not None and response.status_code == 403:
        return HttpResponseRedirect("/")
else:
    return response

【讨论】:

  • 这将是 ajax 请求并且您正在返回 HttpResponseRedirect,我认为 ajax 不能很好地处理重定向响应。你是怎么处理的?
  • @eugene 在我的情况下它不是一个 ajax 调用。我只是从请求 META 对象中的 cookie 中检查。如果您使用 ajax 调用处理此问题,那么它非常简单:您不需要上面的处理程序,只需以这种方式检查 ajax 中的 403 响应“statusCode: {403: function() { window.location='/'} "
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多