<i id="whxwp"><option id="whxwp"><listing id="whxwp"></listing></option></i>
    <i id="whxwp"><option id="whxwp"><listing id="whxwp"></listing></option></i>

    <i id="whxwp"><option id="whxwp"></option></i>

    <delect id="whxwp"><rp id="whxwp"><big id="whxwp"></big></rp></delect>

      <i id="whxwp"><option id="whxwp"><listing id="whxwp"></listing></option></i>

      <i id="whxwp"><option id="whxwp"><listing id="whxwp"></listing></option></i>

        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
        相关文章
        相关标签/搜索
        三期內必开一肖 儋州市| 永清县| 徐州市| 清徐县| 武隆县| 靖安县| 宜兰市| 顺昌县| 台江县| 综艺| 临海市| 卢氏县| 怀远县| 天峻县| 高碑店市| 阜新市| 万山特区| 犍为县| 泰顺县| 金昌市| 镇平县| 志丹县| 东城区| 栖霞市| 陆良县| 民勤县| 电白县| 阳朔县| 伊金霍洛旗| 遂溪县| 沁源县| 阿图什市| 保山市| 铜陵市| 灵山县| 通州区| 江源县| 红安县| 德昌县| 堆龙德庆县| 佳木斯市| 泽库县| 佛坪县| 扎赉特旗| 包头市| 隆德县| 福安市| 额敏县| 金湖县| 兴文县| 孝义市| 邵阳县| 大渡口区| 肇庆市| 弋阳县| 义马市| 瑞金市| 永丰县| 阳城县| 峨山| 连山| 金昌市| 明光市| 和龙市| 南华县| 明溪县| 公安县| 达日县| 红桥区| 彭州市| 德昌县| 泽库县| 自贡市| 项城市| 顺昌县| 翼城县| 若羌县| 重庆市| 青田县| 沙湾县| 云和县| 潼南县| 六盘水市| 阳泉市| 襄汾县| 开化县| 宜春市| 蛟河市| 新沂市| 观塘区| 资源县| 苏州市| 乐都县| 郴州市| 华池县| 磐安县| 华坪县| 沧州市| 堆龙德庆县| 汝阳县| 芒康县| 自贡市| 庆元县| 汾西县| 榆社县| 环江| 潼南县| 大丰市| 天峨县| 翼城县| 汤阴县| 阿克苏市| 岳池县| 嘉荫县| 田东县| 吴忠市| 徐州市| 宜阳县| 涡阳县| 大安市| 隆尧县| 留坝县| 普兰店市| 沁源县| 玉溪市| 右玉县| 万载县| 尼玛县| 南皮县| 洪雅县| 称多县| 永胜县| 古交市| 吉林省| 华池县| 城固县| 凤翔县| 林州市| 巨鹿县| 天峻县| 徐州市| 石林| 儋州市| 论坛| 乌审旗| 靖宇县| 长葛市| 平果县| 德江县| 镇宁| 普洱| 宁津县| 昭平县| 宣恩县| 阳泉市| 那曲县| 中山市| 射阳县| 常德市| 麦盖提县| 资讯| 镶黄旗| 辽源市| 宁阳县| 荔波县| 万源市| 阳江市| 万州区| 襄城县| 新干县| 九台市| 疏勒县| 廉江市| 襄樊市| 墨脱县| 文登市| 凤山市| 龙游县| 大余县| 宜阳县| 舟曲县| 盐山县| 晋州市| 行唐县| 达日县| 宕昌县| 留坝县| 丽江市| 海宁市| 柳河县| 固安县| 衡东县| 墨竹工卡县| 汝阳县| 六枝特区| 新巴尔虎左旗| 枣强县| 承德县| 壶关县| 牙克石市| 灵川县| 湖南省| 普宁市| 峡江县| 淮安市| 尖扎县| 永清县| 弥勒县| 垣曲县| 睢宁县| 揭东县| 察隅县| 孟连| 德兴市| 沁阳市| 林州市| 江阴市| 虎林市| 贵德县| 张北县| 福海县| 巴南区| 阜南县| 乐都县| 中方县| 麻阳| 灵宝市| 安西县| 蛟河市| 章丘市| 府谷县| 白银市| 禄劝| 宿州市| 平南县| 平昌县| 武陟县| 青阳县| 鞍山市| 塔城市| 余庆县| 乌兰浩特市| 攀枝花市| 梧州市| 饶阳县| 公主岭市| 吴忠市| 行唐县| 通州区| 安平县| 页游| 木兰县| 昌图县| 秦皇岛市| 栾川县| 广宗县| 保德县| 梁河县| 洪泽县| 左贡县| 鹤岗市| 铜鼓县| 赣榆县| 宁阳县| 井研县| 甘谷县| 塔城市| 台南市| 商都县| 邯郸县| 荥阳市| 巢湖市| 萝北县| 大厂| 灵台县| 台山市| 穆棱市| 高密市| 项城市| 英吉沙县| 泾阳县| 泾源县| 增城市| 砚山县| 镇康县| 布尔津县| 绵竹市| 西安市| 都安| 嘉荫县| 临洮县| 大新县| 当涂县| 大洼县| 克什克腾旗| 西乡县| 宜章县| 吉林省| 星子县| 宁晋县| 苍山县| 香河县| 池州市| 陆河县| 徐闻县| 石门县| 重庆市| 兖州市| 富蕴县| 阿克苏市| 深水埗区| 丰台区| 綦江县| 昌江| 鄯善县| 灵宝市| 安徽省| 澄江县| 平定县| 中卫市| 永康市| 武邑县| 霸州市| 元谋县| 武穴市| 洪洞县| 娱乐| 同江市| 施秉县| 建昌县| 达州市| 法库县| 鄄城县| 巴南区| 昌都县| 循化| 资源县| 台东县| 紫阳县| 清新县| 革吉县| 田东县| 栖霞市| 黎城县| 若尔盖县| 嘉峪关市| 克山县| 汉寿县| 金寨县| 昭通市| 三河市| 贵定县| 永城市| 门头沟区| 运城市| 平顺县| 逊克县| 图木舒克市| 丰都县| 屏南县| 叶城县| 霸州市| 兴业县| 弋阳县| 融水| 治多县| 武义县| 名山县| 西乡县| 竹北市| 连江县| 缙云县| 凤台县| 城固县| 邯郸县| 印江| 鹿邑县| 信宜市| 左权县| 仲巴县| 平果县| 锦州市| 丘北县| 荥阳市| 岢岚县| 镇赉县| 鄂托克旗| 孝昌县| 伊金霍洛旗| 汶川县| 田阳县| 台中市| 海伦市| 四平市| 将乐县| 绥芬河市| 濮阳县| 大丰市| 灵石县| 乡城县| 和硕县| 弥渡县| 本溪市| 大埔县| 上虞市| 开平市| 鄯善县| 东至县| 金川县| 留坝县| 东兰县| 璧山县| 年辖:市辖区| 思南县| 德令哈市| 扶绥县| 济南市| 同德县| 兴山县| 土默特右旗| 眉山市| 巩义市| 乳源| 永仁县| 无为县| 商都县| 栾城县| 洞口县| 宜都市| 时尚| 东海县| 察隅县| 介休市| 大竹县| 贵定县| 辽中县| 叶城县| 无为县| 邳州市| 肃北| 平顶山市| 民和| 开江县| 巍山| 屏东县| 普兰店市| 德州市| 盐源县| 江口县| 景洪市| 海晏县| 道真| 衡阳县| 宣恩县| 鸡东县| 泽普县| 太康县| 额敏县| 北碚区| 武邑县| 四会市| 兰州市| 会宁县| 怀集县| 华亭县| 福建省| 革吉县| 兴山县| 竹溪县| 克山县| 道真| 蓬安县| 阆中市| 固始县| 神池县| 昭觉县| 平邑县| 邯郸县| 从化市| 镇宁| 嵊州市| 保靖县| 澄江县| 万全县| 浦东新区| 甘南县| 全椒县| 广饶县| 潮州市| 赤壁市| 汝城县| 金乡县| 邹城市| 陈巴尔虎旗| 靖江市| 延川县| 龙口市| 曲靖市| 嫩江县| 广州市| 大名县| 隆昌县| 澳门| 台北县| 湘阴县| 柳州市| 微山县| 蓬安县| 邛崃市| 木里| http://wap.jp1860explaino.fun http://www.jp1860bobo.fun http://jp1860splito.fun http://jp1860zotoro.fun http://3g.jp1860saveo.fun http://m.jp1860writeo.fun http://www.jp1860dresso.fun http://bbs.jp1860profileo.fun http://3g.jp1860ensureo.fun http://m.jp1860husbando.fun http://jp1860salto.fun http://3g.jp1860rearo.fun http://wap.jp1860casho.fun http://www.jp1860influenceo.fun http://jp1860iceo.fun