在使用 django-restful-framework
寫後臺接口的業務中,在下通用的作法;前端
前端數據數據---->檢測(包含限流,認證,權限驗證,數據檢測)---->持久化
其中對於限流和權限驗證,均可以自定義類解決需求,重點仍是在於數據檢測,本着不能相信前端輸入的數據的原則,要作好數據檢測,也不是件垂手可得的事情,畢竟瘋子的想法你是猜不透的。django
這裏針對數據檢測,在這裏說說個人通用作法,仍是以例說明:restful
這裏只是簡單的驗證用戶,根據用戶輸入的姓名,身份證號碼,手機號碼(須要填寫手機號碼是爲了短信驗證,這年頭,不加點料,都對不起本身),驗證輸入的信息是否合法,固然這個驗證不是很靠譜,只是爲了作個例子而已,不用太當真,否則掉進了你是誰,我又是誰的黑洞,那就完蛋了。數據結構
說明:代碼以僞代碼爲主rest
爲何要準備兩個 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__'
這裏簡單了接口
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)
這種作法是我一般寫接口業務的流程,驗證檢測歸驗證檢測,序列化歸序列化,兩種類型互不干擾,固然對於簡單的業務你能夠所有放到同一個 serializer 中,這個根據本身的業務需求走,沒有更好,只有合適。get