【问题标题】:Detect first time user has authenticated using Django Rest Framework检测用户首次使用 Django Rest Framework 进行身份验证
【发布时间】:2017-04-13 01:28:24
【问题描述】:

我正在使用 DRF 来允许我的移动应用程序的用户对我的网络应用程序进行身份验证。

我想在用户第一次使用客户端“登录”时创建一个与该用户关联的模型实例。

我在 DRF 中使用基于令牌的身份验证,对于我的 /api/authenticate/ 端点,我指向 url(r'^authenticate/', restviews.obtain_auth_token),

似乎处理这个问题的最好方法是通过将这个类添加到我的 api/views.py 来覆盖获取AuthToken(APIView)。这个类看起来像这样:

class ObtainAuthTokenCustomized(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)
    serializer_class = AuthTokenSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})


obtain_auth_token = ObtainAuthTokenCustomized.as_view()

看起来我想在 get_or_create 之前插入一个测试,以确定之前是否已为此用户创建了令牌。如果是这样,请执行我计划的模型实例创建。

有没有更好的方法来处理这个问题?

【问题讨论】:

    标签: django authentication django-rest-framework


    【解决方案1】:

    据我所知,这是处理此问题的最佳场所。

    原因是 DRF 目前没有令牌过期功能。因此,一旦使用上述类创建了令牌,它就不会消失。

    这意味着created 将在用户第一次登录时返回 True:

    token, created = Token.objects.get_or_create(user=user)
    

    因此,您只需在以下行测试 created 并执行模型创建或其他必要的操作。

    如果令牌被删除,可能需要额外的逻辑来处理情况。例如,如果您使用创建了一种 API 注销方法,例如给定的in this answer

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2019-04-02
      • 2015-06-01
      • 2018-07-04
      • 2012-08-17
      • 2019-02-20
      相关资源
      最近更新 更多