用户认证在DRF中花费很长时间

时间:2019-02-08 18:26:34

标签: python django django-rest-framework

我正在将ModelViewSet权限类与IsAuthenticatedOrReadOnly一起使用,就像这样:

class PostViewSet(viewsets.ModelViewSet, MarkdownToHTML):
    permission_classes = (IsAuthenticatedOrReadOnly,)

当我在可浏览的API中调用此视图时,数据将在大约1100毫秒(已经太长)中返回,但是当我从前端UI调用时,调用将花费6000-7000毫秒!

这两种调用同一视图的方法之间的唯一区别是,我从前端UI应用程序传递了一个json令牌。当我注释掉令牌头时,响应将在大约1秒钟内返回,与可浏览API中的返回时间相同。

这个简单的身份验证步骤如何花费5秒钟以上?

这是权限类别:

class IsAuthenticatedOrReadOnly(BasePermission):
    """
    The request is authenticated as a user, or is a read-only request.
    """

    def has_permission(self, request, view):
        return (
            request.method in SAFE_METHODS or
            request.user and
            request.user.is_authenticated
        )

1 个答案:

答案 0 :(得分:2)

我在一个项目中遇到过类似的问题。我会告诉您我的经验以便尝试提供帮助,我无法告诉您确切的问题是什么,但是我会把我有我时检查过的东西贴出来。

问题是解码auth令牌是一项非常昂贵的操作,因此您必须检查:

  1. 您认为这种令牌(如果提供)解码了多少次?
  2. 您可以使用cookie来缓存身份验证令牌,设置到期时间吗?
  3. 此令牌在服务器上发送和发送多少次?

另一方面,请记住,DRF会根据令牌的长度(以及令牌发生的次数)将json转换为python对象(特别是字典),这也是非常昂贵的操作。