DRF - 实现一个简单的 token 认证

rest framework 的 APIView 是继承 django 的 View,且有所扩展

代码:

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView  # 要被视图函数所继承的
from rest_framework import exceptions  # 异常处理


# 自己写的认证类,要继承 BaseAuthentication
class MyAuthentication(BaseAuthentication):
    # 实例化对象要执行的方法
    # 在 rf 的 request.py 的 _authenticate 函数中
    def authenticate(self, request):
        # 通过原生的 request 数据
        token = request._request.GET.get("token")
        # 去数据库中进行匹配
        token = models.UserToken.objects.filter(token=token).first()
        if not token:
            raise exceptions.AuthenticationFailed("用户认证失败")
        return ("admin", None)  # 返回一个元组

    def authenticate_header(self, request):
        pass


class UsersView(APIView):
    # 对象列表,遍历列表生成实例对象,用于认证
    authentication_classes = [MyAuthentication, ]

    def get(self, request, *args, **kwargs):
        # request.user 的值是返回的元组中的第一个参数
        # request.auth 的值是返回的元组中的第二个参数
        print(request.user)
        return HttpResponse("ok!")

要通过 MyAuthentication 的认证才能执行 UsersView 中的 get 函数

直接访问:

在 url 后面加一个 token 参数

Pycharm 中的执行结果:

 

posted @ 2021-01-12 23:55  Sch01aR#  阅读(355)  评论(0编辑  收藏  举报