Django DRF框架相关内容

JWT 认证

JWT 认证可以解决 HTTP 无状态认证及跨域登录的问题,常见于不同域名网页使用同一账户登录的解决方案当中,在 Django 中可以使用 JWT 代替 Session 进行认证。Session 一般保存于服务器的数据库中,而 JWT 通过 Token 的形式,将认证结果保存在 cookie 中,二者在保存上存在区别

实现

  • pyjwt 2.4.0

实现代码如下:

class JWTAuth(View):
    """create token and decode token"""
    def post(self, request, *args, **kwargs):
        username = request.POST.get('username')
        password = request.POST.get('password')
        # check username and password
        user = authenticate(request, username=username, password=password)
        if user is not None and user.is_active:
            # use get_jwt_token to create a token
            jwt_token = self.get_jwt_token(username)
            return JsonResponse({
    
    "jwt_toke":jwt_token})
        return JsonResponse({
    
    "message":"check name and password"})
    
    def get(self, request):
        headers = request.headers
		# check jwttoken in headers or not
        if 'jwttoken' in headers:
            # decode token
            if self.decode_jwt_token(headers['jwttoken']):
                return JsonResponse({
    
    "message":"This is Auth page!"})
            else:
                return JsonResponse({
    
    "error":"You get a wrong token"})
        else:
            return JsonResponse({
    
    "error":"You dont have token"})
        return JsonResponse({
    
    "message":"this is token page!"})
    
    @staticmethod
    def get_jwt_token(username):
        """crete jwt token"""
        payload={
    
    
            # Set the expiration time for example 3600 seconds
            'exp':datetime.datetime.utcnow() + datetime.timedelta(3600),
            'iat':datetime.datetime.utcnow(),
            'data':{
    
    'username':username},
        }
        # payload:payload
        # string:salt
        # algorthm:encryption method
        encode_jwt = jwt.encode(payload, "jfjufcb37%jfjoeo", algorithm='HS256')
        return encode_jwt
    
    @staticmethod
    def decode_jwt_token(encode_jwt):
        """decode jwt """
        result = jwt.decode(encode_jwt,"jfjufcb37%jfjoeo", algorithms=['HS256'])
        return result

DRF中各类报错问题汇总

serializers.CurrentUserDefault 报错提示 request 错误

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qoNk2CQD-1666513909338)(https://img-blog.cksdnimg.cn/461480b42c234a3a9146f5fa1b97289b.png)]
报错截图
通过查看报错信息,可以知道是
在这里插入图片描述
该类被调用时通过上下文 context 获取 request 对象的 user 值进行返回,打上断点之后发现访问时上下文为空字典,自然无法获取 request 这个 key 的值,查询官方的文档可以得知,需要在序列化器初始化时将 request 作为上下文字典进行传入
在这里插入图片描述
因此在视图层增加一个上下文字典即可
在这里插入图片描述
以上示例代码均来自@大江狗

猜你喜欢

转载自blog.csdn.net/qq_20728575/article/details/126005424