zoukankan      html  css  js  c++  java
  • rest_framework之ModelViewSet、路由控制、序列化组件快速搭建项目雏形

    以UserInfo表登陆接口为例

    ModelViewSet的用法十分简单,定义一个视图类,指定一个模型表,指定一个序列化类即可帮我们完成增删改查等功能

    示例:

    # 视图层

    from
    app01.MySerailizers import UserSerializer from rest_framework.viewsets import ModelViewSet class Login(ModelViewSet): # 继承ModelViewSet # authentication_classes = [] # permission_classes = [] queryset = models.UserInfo.objects.all() # 指定模型表 这里的.all()加与不加不影响,内部源码有做处理 serializer_class = UserSerializer # 指定自己定义的序列化类

    路由控制Route的使用方法也十分简单

    步骤:

      1、导入路由控制类

        DefaultRouter可以帮我们产生4条路由,SimpleRouter可以帮我们产生2条路由

        from rest_framework.routers import DefaultRouter,SimpleRouter

      2、生成路由控制类对象并注册

        router = DefaultRouter()   # 实例化路由控制对象
        router.register("login",views.Login)  # 注册

      3、编写路由,固定写法

        from django.conf.urls import include
    
        urlpatterns = [
            url(r'', include(router.urls)),
        ]

    结合上例路由层:

    from rest_framework.routers import DefaultRouter,SimpleRouter
    from django.conf.urls import include
    
    router = DefaultRouter()
    router.register("login",views.Login)
    
    urlpatterns = [
        url(r'', include(router.urls)),
    
    ]

    序列化组件层:

    Mserailizers.py

    from rest_framework import serializers
    from app01 import models
    from rest_framework.exceptions import ValidationError
    class UserSerializer(serializers.ModelSerializer):  # 这里用的是ModelSerailizer
        class Meta():
            model = models.UserInfo
            fields = "__all__"
    
        def validated_username(self,value:str):
            if not value:
                raise ValidationError("用户名不能为空!")
            elif len(value)<3:
                raise  ValidationError("用户名不能低于3位!")
            elif value[0].isdigit():
                raise ValidationError("用户名不能以数字开头!")
            elif not value.isalpha():
                raise ValidationError("用户名只能是字母数字下划线组成!")
            else:
                return value
    
        def validated_password(self,value):
            if not value:
                raise ValidationError("密码不能为空!")
            else:
                return value

    关于Serailizers序列化组件详见:https://www.cnblogs.com/dongxixi/p/11130052.html

     这样我们就快速完成了一个接口了,当然,这离实际应用还需要添加身份认证、权限认证、频率校验、版本控制等等,这些其实配置起来都一样简单,下面继续...

    频率组件

    频率组件
            -限制用户访问次数
            -使用:
                -写一个类继承,最好单独开PY文件写
                class Throttle(SimpleRateThrottle):
                    scope = 'lxx'
                    def get_cache_key(self, request, view):
                        return request.META.get('REMOTE_ADDR')
                        #返回什么值,就以什么做过滤,返回用户id,就以用户id做过滤
                        #return self.get_ident(request)  默认,以IP做限制
    
                -在setting中配置:
                    'lxx':'3/minute'
            -局部使用:
                -在视图类中配置:
                    throttle_classes=[MyThrottle,]
            -全局使用:
                在setting中配置
                    REST_FRAMEWORK={
                        'DEFAULT_THROTTLE_CLASSES': ['app01.MyAuths.MyThrottle',],
    
              }
            
            -查找顺序:先从自己类中找-----》项目setting配置文件中找-----》drf默认的里面找        
  • 相关阅读:
    HADOOP docker(六):hive简易使用指南
    HADOOP docker(四):安装hive
    HADOOP docker(二):HDFS 高可用原理
    Python 自用代码(调整日期格式)
    Python 自用代码(某方标准类网页源代码清洗)
    python合并多个csv文件并去重
    Python连接MySQL乱码(中文变问号)
    Shell实现循环执行curl向Solr导入json文件
    Python 自用代码(拆分txt文件)
    shell报错:未预期的符号***附近有语法错误
  • 原文地址:https://www.cnblogs.com/dongxixi/p/11151690.html
Copyright © 2011-2022 走看看