DRF | 我寫接口業務的流程

在使用 django-restful-framework 寫後臺接口的業務中,在下通用的作法;前端

前端數據數據---->檢測(包含限流,認證,權限驗證,數據檢測)---->持久化

其中對於限流和權限驗證,均可以自定義類解決需求,重點仍是在於數據檢測,本着不能相信前端輸入的數據的原則,要作好數據檢測,也不是件垂手可得的事情,畢竟瘋子的想法你是猜不透的。django

這裏針對數據檢測,在這裏說說個人通用作法,仍是以例說明:restful

1 場景:認證服務

這裏只是簡單的驗證用戶,根據用戶輸入的姓名,身份證號碼,手機號碼(須要填寫手機號碼是爲了短信驗證,這年頭,不加點料,都對不起本身),驗證輸入的信息是否合法,固然這個驗證不是很靠譜,只是爲了作個例子而已,不用太當真,否則掉進了你是誰,我又是誰的黑洞,那就完蛋了。數據結構

2 業務流程步驟

說明:代碼以僞代碼爲主rest

2.1 準備兩個 serializer

爲何要準備兩個 serializer,由於:code

  • 輸入的數據結構和你指望返回的數據結構有多是不同的
  • 業務拆分,保持業務獨立,清晰

檢測數據的 serializer:orm

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 中,這個根據本身的業務需求走,沒有更好,只有合適。get

相關文章
相關標籤/搜索