正在进入ing...

drf补充篇-关于payload的自定义内容

发布时间:2022-06-30 浏览量: 447 文章分类: python

drf补充篇-关于payload的自定义内容

日常我们使用前后端分离的时候,不可能说我们的payload完全是符合前端的需求的,比如他们希望可以增加用户的头像、组别等信息,这些信息你可以通过明文,当然也可以通过放在payload中一起传输。强烈建议你先看看我之前的关于drf的一些介绍。

关于引入rest_framework相关那些我就不在赘述了。

settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 'rest_framework.authentication.BasicAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
    # 关闭文档提示
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'utils.jwt_payload.jwt_response_payload_handler',
    'JWT_PAYLOAD_HANDLER': 'utils.jwt_payload.jwt_payload_handler',  # 自定义payload内容
    # 是否开启允许Token刷新服务,及限制Token刷新间隔时间,从原始Token获取开始计算
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=365),
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
}

注意JWT_RESPONSE_PAYLOAD_HANDLER、JWT_PAYLOAD_HANDLER

实现自定义返回内容

utils.jwt_payload.py

from rest_framework_jwt.settings import api_settings
from rest_framework_jwt.utils import jwt_decode_handler
import datetime

def jwt_response_payload_handler(token, user=None, request=None):
    """为返回的结果添加用户相关信息"""
    return {
        'status_code': 20000,
        'token': token,
    }

def get_jwt_token(user):
    # JWT做状态保持的时机是:用户注册成功之后,返回结果之前
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    # 当前的注册用户对象
    payload = jwt_payload_handler(user)
    # JWT token
    token = jwt_encode_handler(payload)
    return token

def jwt_payload_handler(user, exp=datetime.datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA):
    payload = {}  # 返回的荷载信息
    payload['user_name'] = user.first_name
    payload['exp'] = exp
    payload['user_id'] = user.id
    payload['phone'] = user.userinfo.phone
    payload['cover_img'] = user.userinfo.cover_img
    return payload