<thead id="dlkbl"></thead>
    <sub id="dlkbl"><del id="dlkbl"></del></sub>

  • <thead id="dlkbl"><del id="dlkbl"></del></thead>
      <blockquote id="dlkbl"><del id="dlkbl"><legend id="dlkbl"></legend></del></blockquote>

      JWT自定义校验规则与生成、用户多种方式登陆、搜索过滤,排序,分页


      # 自定义校验token规则
      1.视图类
      from .authentications import JWTAuthentication
      
      class UserDetail1(APIView):
          permission_classes = [IsAuthenticated]  # 必须登录
          authentication_classes = [JWTAuthentication]  # jwt用户token自定义登陆认证规则
      
          def get(self, request, *args, **kwargs):
              return APIResponse(results={username: request.user.username})
      2.自定义token规则,在api生成一个authentications.py认证文件
      import jwt
      from rest_framework_jwt.authentication import BaseJSONWebTokenAuthentication
      from rest_framework_jwt.authentication import jwt_decode_handler
      from rest_framework.exceptions import AuthenticationFailed
      
      class JWTAuthentication(BaseJSONWebTokenAuthentication):
          def authenticate(self, request):
              jwt_token = request.META.get(HTTP_AUTHORIZATION)
      
              # 自定义规则 :auth token jwt,调用下面规则方法
              token = self.parse_jwt_token(jwt_token)
      
              # 如果没有值,无法校验
              if token is None:
                  return None
      
              try:
                  # token =>payload  反向解析出payload
                  payload = jwt_decode_handler(token)
              except jwt.ExpiredSignature:  # 判断是否过期
                  raise AuthenticationFailed(token已过期)
              except:
                  raise AuthenticationFailed(非法用户)
              user = self.authenticate_credentials(payload) # 根据payload解析出user
      
              return (user, token)
      
          # 自定义校验规则:auth token jwt ,auth为前言,jwt为后缀
          def parse_jwt_token(self, jw_token):
              tokens = jw_token.split()
              if len(tokens) != 3 or tokens[0].lower() != auth or tokens[2].lower() != jwt:
                  return None
              # 把token核心内容返回进行校验
              return tokens[1]

      # 自定义 drf-jwt 配置
      import datetime
      JWT_AUTH = {
          # user => payload
          JWT_PAYLOAD_HANDLER:
              rest_framework_jwt.utils.jwt_payload_handler,
          # payload => token
          JWT_ENCODE_HANDLER:
              rest_framework_jwt.utils.jwt_encode_handler,
          # token => payload
          JWT_DECODE_HANDLER:
              rest_framework_jwt.utils.jwt_decode_handler,
          # token过期时间
          JWT_EXPIRATION_DELTA: datetime.timedelta(days=7),
          # token刷新的过期时间
          JWT_REFRESH_EXPIRATION_DELTA: datetime.timedelta(days=7),
          # 反爬小措施前缀
          JWT_AUTH_HEADER_PREFIX: JWT,
      }

      实现多种方式登录签发token:比如 -账号、手机号、邮箱等登录:
      1.禁用认证与权限组件
      2.拿到前台登录信息,交给序列化类
      3.序列化校验得到登陆用户与token存放在序列化对象中
      4.取出登陆用户与token返回给前台
      """

      from .serializers import UserModelSerializer

      # 1.视图类
      class LoginAPIView(APIView):
          authentication_classes = []  # 禁用认证
          permission_classes = []  # 禁用权限
      
          def post(self, request, *args, **kwargs):
              user_ser = UserModelSerializer(data=request.data)  # 反序列化进行校验
              # 校验通过,如果没有报异常
              user_ser.is_valid(raise_exception=True)
      
              # 正常登陆,把生成的token返回给前端
              return APIResponse(token=user_ser.token, results=UserModelSerializer(user_ser.user).data)
        
      #2. 序列化类,进行校验,生成token发送出去
      from rest_framework import serializers
      from . import models
      import re
      
      from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
      
      class UserModelSerializer(serializers.ModelSerializer):
          # 自定义反序列化字段:一定要设置write_only,值参与反序列化,不会与model类字段映射
          usr = serializers.CharField(write_only=True)
          pwd = serializers.CharField(write_only=True)
      
          class Meta:
              model = models.User
              fields = [usr, pwd, username, mobile, email]
              # 系统校验规则
              extra_kwargs = {
                  # ‘usr‘: {
                      # ‘required‘: True,  # 必须校验
                  #     ‘min_length‘: 3,
                  #     ‘error_messages‘: {
                  #         ‘required‘: ‘必须填写,你个铺盖‘,
                  #         ‘min_length‘: ‘太短楼!‘,
                  #     }
                  # },
                  username: {
                      read_only: True
                  },
                  mobile: {
                      read_only: True
                  },
                  email: {
                      read_only: True
                  }
      
              }
      
          # 全局钩子,attrs里面是通过校验的
          def validate(self, attrs):
              usr = attrs.get(usr)
              pwd = attrs.get(pwd)
              # 多方式登录:各分支处理得到该方式对应的用户
              if re.match(r[email protected]+, usr):
                  user_query = models.User.objects.filter(email=usr)
              elif re.match(r1[3-9][0-9]{9}, usr):
                  user_query = models.User.objects.filter(mobile=usr)
              else:
                  user_query = models.User.objects.filter(username=usr)
              user_obj = user_query.first()
      
              if user_obj and user_obj.check_password(pwd):
                  # 签发生成token,将token存放到实例化对象的中
                  payload = jwt_payload_handler(user_obj)  # 把头部,和载荷过期时间,user对象,生成payload
                  token = jwt_encode_handler(payload)  # 把头部,载荷,和秘=秘钥经过加密生成token
                  self.token = token  # 把token赋值到对象中
                  self.user = user_obj
                  print(token)
                  return attrs
              raise serializers.ValidationError({data: 数据提供有误})
       
      搜索过滤,排序,分页:
      from . import models
      from .serializers import CarModelSerializer
      # Car的群查接口
      from rest_framework.generics import ListAPIView
      
      # 1.drf的SearchFilter - 搜索过滤
      from rest_framework.filters import SearchFilter
      
      # 2.drf的OrderingFilter - 排序过滤
      from rest_framework.filters import OrderingFilter
      
      # 3.drf的分页类 - 自定义
      from . import pagenations
      
      class CarListAPIView(ListAPIView):
          permission_classes = []  # 权限取消
          authentication_classes = []  # 认证取消
      
          queryset = models.Car.objects.all()
          serializer_class = CarModelSerializer
      
          # 局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
          filter_backends = [SearchFilter,OrderingFilter]
      
          # SearchFilter过滤类依赖的过滤条件 => 接口:/cars/?search=...
          search_fields = [name, price]
      
          # OrderingFilter过滤类依赖的过滤条件 => 接口:/cars/?ordering=...,正是升序,-则是降序
          ordering_fields = [pk, price]
          # eg:/cars/?ordering=-price,pk,先按price降序,如果出现price相同,再按pk升序
      
          pagination_class = pagenations.MyPageNumberPagination
       
      # 自定义分页类
      from rest_framework.pagination import PageNumberPagination
      
      class MyPageNumberPagination(PageNumberPagination):
          # ?page=页码
          page_query_param = page
      
          # ?page=页面 下默认一页显示的条数
          page_size = 3
      
          # ?page=页面&page_size=条数 用户自定义一页显示的条数
          page_size_query_param = page_size
      
          max_page_size = 5
      相关文章
      相关标签/搜索
      4887王中王鉄算盘开奖结 湟中县| 宾阳县| 墨竹工卡县| 九龙城区| 勐海县| 武平县| 敦煌市| 丽水市| 犍为县| 卫辉市| 扶绥县| 衡阳市| 长岛县| 吉安市| 兰溪市| 吉木乃县| 新和县| 广水市| 宝坻区| 名山县| 孟连| 木兰县| 北碚区| 天峻县| 葵青区| 射洪县| 神农架林区| 曲阜市| 永吉县| 开阳县| 庄河市| 东方市| 高碑店市| 马关县| 林芝县| 昌江| 汪清县| 苗栗县| 宁夏| 肥东县| 黔南| 南华县| 嘉鱼县| 湾仔区| 杭州市| 桑日县| 井研县| 和平区| 华容县| 墨江| 吴忠市| 昌平区| 定襄县| 高碑店市| 瓦房店市| 疏勒县| 白玉县| 微山县| 临城县| 玉林市| 丰宁| 同江市| 筠连县| 祁阳县| 壤塘县| 姚安县| 冕宁县| 霞浦县| 海伦市| 丰镇市| 万全县| 丹凤县| 武威市| 镇坪县| 江达县| 龙山县| 香河县| 苏州市| 浦东新区| 蓬安县| 融水| 连南| 海淀区| 平湖市| 大安市| 北票市| 金阳县| 凤阳县| 汽车| 永福县| 都匀市| 永新县| 巧家县| 澄城县| 武威市| 福泉市| 渝中区| 驻马店市| 滦南县| 全椒县| 卓资县| 衡东县| 锡林浩特市| 咸丰县| 灌南县| 津市市| 屏山县| 大兴区| 泉州市| 武陟县| 高安市| 武义县| 东光县| 柯坪县| 陆良县| 商水县| 阿城市| 台中市| 武陟县| 吴堡县| 灵寿县| 时尚| 股票| 鄂伦春自治旗| 隆回县| 长沙县| 平邑县| 龙口市| 温泉县| 通山县| 湟中县| 葫芦岛市| 湘阴县| 西贡区| 贵港市| 金昌市| 张家川| 河津市| 剑川县| 安义县| 南召县| 郓城县| 上饶县| 余姚市| 台南县| 湘乡市| 金湖县| 新兴县| 宣化县| 绥棱县| 胶南市| 宁远县| 大新县| 博罗县| 广饶县| 南阳市| 平舆县| 呼玛县| 承德县| 车险| 介休市| 高台县| 鲁山县| 大荔县| 新干县| 邹城市| 鄄城县| 大关县| 霍州市| 桓仁| 延边| 波密县| 合山市| 亳州市| 长丰县| 出国| 綦江县| 襄垣县| 崇明县| 漯河市| 安福县| 嘉禾县| 天全县| 邯郸县| 景东| 哈巴河县| 内乡县| 襄汾县| 宁武县| 焉耆| 大庆市| 小金县| 都安| 昭平县| 怀仁县| 靖江市| 景德镇市| 扶余县| 乡宁县| 东台市| 土默特右旗| 开原市| 邵武市| 青岛市| 赤城县| 郸城县| 锡林浩特市| 吉安市| 南郑县| 河津市| 瓦房店市| 静海县| 淮阳县| 东莞市| 奇台县| 屏山县| 安宁市| 永川市| 星子县| 乌鲁木齐县| 巴彦淖尔市| 桐乡市| 镇巴县| 浑源县| 梧州市| 交口县| 佛山市| 大理市| 武威市| 乌鲁木齐市| 宜丰县| 堆龙德庆县| 厦门市| 久治县| 大邑县| 建阳市| 兴隆县| 儋州市| 上虞市| 尼勒克县| 定兴县| 卢氏县| 宜州市| 安西县| 伊通| 唐海县| 邯郸市| 连城县| 昆山市| 通州市| 五峰| 保德县| 大新县| 夏津县| 图们市| 泸西县| 宜兴市| 绥化市| 永顺县| 栾城县| 翼城县| 霞浦县| 信丰县| 四平市| 印江| 唐山市| 阳东县| 鄂托克前旗| 龙江县| 凤冈县| 泰州市| 成都市| 彰化县| 扬州市| 五华县| 定西市| 霍林郭勒市| 广西| 多伦县| 行唐县| 富阳市| 邵武市| 苏尼特右旗| 岱山县| 固镇县| 通州区| 筠连县| 富裕县| 武定县| 太仆寺旗| 清苑县| 广水市| 汉阴县| 桑日县| 丹棱县| 万年县| 海盐县| 新巴尔虎左旗| 务川| 太原市| 湘潭县| 上高县| 元阳县| 榆树市| 江北区| 福海县| 宝坻区| 神池县| 海林市| 新乡县| 新建县| 海盐县| 高阳县| 吴堡县| 赫章县| 沙洋县| 泽州县| 秀山| 容城县| 顺昌县| 巴南区| 奎屯市| 石台县| 许昌市| 凌云县| 沈丘县| 奉贤区| 灵寿县| 楚雄市| 陆川县| 长岭县| 阿拉尔市| 渑池县| 澎湖县| 乐平市| 和田县| 石狮市| 台山市| 泾川县| 张家界市| 怀宁县| 德江县| 曲靖市| 芦山县| 隆安县| 兰考县| 宣武区| 陆川县| 德清县| 轮台县| 绥芬河市| 新兴县| 新营市| 阿拉善左旗| 沿河| 阿克陶县| 西和县| 库车县| 西吉县| 定边县| 株洲市| 即墨市| 香河县| 海原县| 武隆县| 商水县| 深泽县| 博罗县| 武宁县| 汉沽区| 樟树市| 巴塘县| 历史| 昭苏县| 七台河市| 浙江省| 宜阳县| 大邑县| 旌德县| 平阳县| 尚志市| 科技| 陈巴尔虎旗| 策勒县| 西城区| 台前县| 子长县| 吉木乃县| 民勤县| 哈巴河县| 宣威市| 儋州市| 申扎县| 丰都县| 固始县| 沁阳市| 昌邑市| 土默特右旗| 永嘉县| 容城县| 北碚区| 和顺县| 禄丰县| 高密市| 昌江| 玛曲县| 寻甸| 夹江县| 申扎县| 县级市| 水富县| 洛扎县| 富平县| 临夏县| 古浪县| 崇仁县| 景谷| 彩票| 行唐县| 安福县| 当雄县| 浦城县| 田林县| 湾仔区| 喀喇| 宜昌市| 郑州市| 赣榆县| 凌海市| 丰台区| 山东| 寿光市| 齐齐哈尔市| 内乡县| 新密市| 宕昌县| 莱西市| 来凤县| 温宿县| 化德县| 抚松县| 饶平县| 元氏县| 饶阳县| 天长市| 清新县| 渑池县| 天门市| 太谷县| 府谷县| 竹北市| 奉贤区| 陆良县| 连云港市| 元阳县| 云林县| 凤台县| 从化市| 新化县| 稻城县| 南江县| 盐边县| 社旗县| 高淳县| 锦州市| 泾源县| 万山特区| 汝阳县| 康马县| 乌拉特中旗| 阿图什市| 夹江县| 南陵县| 乌鲁木齐市| 万山特区| 巴彦淖尔市| 廉江市| 大姚县| 防城港市| 赫章县| 从江县| 开江县| 常熟市| 哈密市| 玉山县| 托克托县| 申扎县| 长汀县| 定西市| 集贤县| 枣庄市| 米林县| 神木县| 灵石县| 阜南县| 郯城县| 翁源县| 措美县| 陇南市| 雅安市| 彭泽县| 长岭县| 辛集市| 高清| 瑞安市| 宽城| 彭山县| 九台市| 德江县| 加查县| http://jp1860learno.fun http://jp1860graduateo.fun http://www.jp1860nuzbero.fun http://m.jp1860findo.fun http://m.jp1860deposito.fun http://m.jp1860dateo.fun http://www.jp1860subzito.fun http://m.jp1860cazpaigno.fun http://www.jp1860produceo.fun http://www.jp1860profileo.fun http://www.jp1860hillo.fun http://www.jp1860jointo.fun http://www.jp1860forceo.fun http://www.jp1860balanceo.fun http://jp1860teacho.fun