DRF | 我写接口业务的流程

在使用 django-restful-framework 写后台接口的业务中,在下通用的做法;

前端数据数据---->检测(包含限流,认证,权限验证,数据检测)---->持久化

其中对于限流和权限验证,都可以自定义类解决需求,重点还是在于数据检测,本着不能相信前端输入的数据的原则,要做好数据检测,也不是件轻而易举的事情,毕竟疯子的想法你是猜不透的。

这里针对数据检测,在这里说说我的通用做法,还是以例说明:

1 场景:认证服务

这里只是简单的验证用户,根据用户输入的姓名,身份证号码,手机号码(需要填写手机号码是为了短信验证,这年头,不加点料,都对不起自己),验证输入的信息是否合法,当然这个验证不是很靠谱,只是为了做个例子而已,不用太当真,不然掉进了你是谁,我又是谁的黑洞,那就完蛋了。

2 业务流程步骤

说明:代码以伪代码为主

2.1 准备两个 serializer

为什么要准备两个 serializer,因为:

  • 输入的数据结构和你期望返回的数据结构有可能是不一样的
  • 业务拆分,保持业务独立,清晰

检测数据的 serializer:

class VerifyForm(serializers.Serializer):
    """验证认证用户输入数据"""
    username = serializers.CharField(max_length=64, min_length=2)
    id_number = serializers.CharField(max_length=18, min_length=15)
    sms_code = serializers.CharField(max_length=6, min_length=6)
    
    def validate_username(self, value):
        if 检测输入的用户名不合法:
            raise 异常
        return value
            
    def validate_id_number(self, value):
        if 检测输入的身份证号码不合法:
            raise 异常
        return value
        
    def validate_sms_code(self, value):
        if 检测输入的短信验证码不合法:
            raise 异常
        return value
    
    def validate(self, attrs):
        if 外部服务(username, id_number) 不合法:
            raise 异常
        return attrs
        
    def create(self, validated_data):
         持久化
         return instance

序列化对象的 serializer:

class VerifySerializer(serializers.ModelSerializer):
    """序列化数据"""

    你可以做点自己喜欢的事情,啊哈

    class Meta:
        model = Verify
        fields = '__all__'

2.2 书写 views

这里简单了

def perform_create(self, serializer):
    return serializer.save()

def create(self, request, *args, **kwargs):
    serializer = VerifyForm(data=request.data, context={'request': request})
    # 检验数据
    serializer.is_valid(raise_exception=True)
    # 持久化
    instance = self.perform_create(serializer)
    # 序列化数据
    serializer = self.get_serializer(instance)

    return Response(serializer.data)

2.3 小结

这种做法是我通常写接口业务的流程,验证检测归验证检测,序列化归序列化,两种类型互不干扰,当然对于简单的业务你可以全部放到同一个 serializer 中,这个根据自己的业务需求走,没有更好,只有合适。


黑月亮
点滴记录,步步成长

现实与完美之间

1.6k 声望
24 粉丝
0 条评论
推荐阅读
centos | 修改静态 IP
设置 Centos 为使用静态 IP1 修改网络配置 {代码...} 修改后的内容如下 {代码...} 2 重启网络服务 {代码...} 3 查看地址 {代码...} 参考来源:[链接]

青阳半雪阅读 1.8k评论 3

三、djanjo
Django 提示:本文根据b站黑马python课整理链接指引 => 黑马程序员python企业级开发项目-手把手从0到1开发《美多商城》视图介绍和项目准备视图介绍视图就是应用中views.py文件中的函数视图的第一个参数必须为H...

玲小叮当阅读 936

Django笔记二十二之多数据库操作
在第十篇笔记的时候,简单介绍过 using() 的使用方法,多个数据库就是通过 using(db_alias) 的方式来来指定选中的数据库,这里介绍一下同步库表结构时候的操作。

Hunter阅读 818

封面图
Django笔记十三之select_for_update等选择和更新等相关操作
本篇笔记将介绍 update 和 create 的一些其他用法,目录如下:get_or_createupdate_or_createselect_for_updatebulk_createbulk_update1、get_or_create前面我们介绍过 get() 和 create() 的用法,那么 get_or_cr...

Hunter阅读 762

封面图
Django笔记十二之defer、only指定返回字段
defer 的英语单词的意思是 延迟、推迟,我们可以通过将字段作为参数传入,可以达到在获取数据的时候指定不获取该字段数据,常用于一些 textfield 字段上。

Hunter阅读 721

封面图
Django笔记十四之统计总数、最新纪录和空值判断等功能
本篇笔记将介绍一些 Django 查询中统计总数、最新纪录和空值判断等功能。countin_bulklatest、earliestfirst、lastexistscontains、icontainsgt、gte、lt、ltestartswith、istartswithisnull1、count返回查询的 Q...

Hunter阅读 677

封面图
Django笔记六之外键ForeignKey介绍
这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法。这是一种一对多的字段类型,表示两张表之间的关联关系。本篇笔记的目录如下:on_deleterelated_namerelated_query_name外键字段的...

Hunter阅读 666

现实与完美之间

1.6k 声望
24 粉丝
宣传栏