天天看點

REST framework 程式設計核心思想

web開發的兩種模式:

  • 前後端分離模式-----對于Django架構,一般要求遵循REST(表現層狀态轉化)設計風格,在這個基礎上,出現了一個DRF(Django+REST+FRAMEWORK)架構,是對Django的再次封裝,這個架構可以幫助我們這些苦逼的程式員減少代碼量,主要承擔了一些權限認證,序列化與反序列化的操作。
  • 前後端不分離------在此不再論述,本文主要針對前後端分離。

搭建DRF項目工程

  • 準備工作:安裝Python和Django,然後用指令 pip install djangorestframework安裝架構包。

前後端分離中,後端開發人員的核心任務:序列化與反序列化

  • 建立工程,具體過程見下面代碼
在PYcharm中的終端輸入指令:
# 建立工程,名字叫demo
django-admin startproject demo
# 建立具體應用book_drf
python manage.py  startapp book_drf
# 将rest_framework注冊到setting.py 下的INSTALLED_APPS裡
INSTALLED_APPS = [
    ...
   'rest_framework']

+ 在開發REST API接口時,我們在視圖中需要做的最核心的事是:

	将資料庫資料序列化為前端所需要的格式,并傳回;

	将前端發送的資料反序列化為模型類對象,并儲存到資料庫中。
	是以我們現在用DRF架構實作以下這個功能,感受一下。
	
	實作驗證和反序列化的步驟,序列化步驟類似,不再舉例:
	1-建立一個serializers.py檔案,定義一個序列化的類作為序列化器,裡面可以寫一些驗證的代碼和反序列化的代碼。
	2-在views.py 檔案執行個體化serializers.py中的類,執行個體化後可以調用序列化器的方法,說白了就是驗證和反序列化操作單獨放在一個檔案,執行個體化對象去調用。
	# serializers.py
	from user.models import BookInfo
	from rest_framework import serializers
	from django.http import JsonResponse

	# 建立序列化器,用來驗證字段是否符合模型類定義的規則。
	class BookSerilizer(serializers.Serializer):
	# btitle 圖書名字
    btitle=serializers.CharField(max_length=20)
    # bpub_date 圖書釋出時間
    bpub_date=serializers.DateField()
    #bread 圖書閱讀量
    bread = serializers.IntegerField(label='閱讀量',default=0)
    # bcomment 圖書閱讀量
    bcomment = serializers.IntegerField(label='評論量',default=0)
    # 如果還需要進一步篩選過濾條件,就繼續定義函數,validate函數對應views.py 中的post請求,比如我規定如果閱讀量<評論量就抛出異常,如果滿足才會繼續執行下一步代碼,這樣就可以篩選出符合條件的資料。
    def validate(self, attrs):
        bread = attrs['bread']
        bcomment = attrs['bcomment']
        if bread < bcomment:
            raise serializers.ValidationError('閱讀量小于評論量')
        return attrs
     # create函數完成的是views.py中put請求儲存資料,比如使用者送出過來的圖書資訊,validated_data這個參數就表示完成驗證後的資料,完整驗證後就需要儲存到資料庫。
    def create(self, validated_data):
        return BookInfo.objects.create(**validated_data)
     # update函數用來更新圖書資料,對應views.py中的put請求,instance表示一個圖書對象。
    def update(self, instance, validated_data):
        instance.btitle=validated_data["btitle"]
        instance.bpub_date=validated_data["bpub_date"]
        instance.bread=validated_data["bread"]
        instance.bcomment=validated_data["bcomment"]
        instance.save()
        return JsonResponse({"mesg":"ok"})
     # 下面是views.py檔案代碼。
	from user.models import BookInfo
	from django.views import View
	from book_drf.serializer import BookSerilizer
	import json
	from django.http import JsonResponse
	class Bookserilizer(View):
    	def post(self,request):
	        data=request.body.decode()
	        data_dict=json.loads(data)
	        ser=BookSerilizer(data=data_dict)
	        err=ser.is_valid()
	        print(err)
	        print(ser.errors)
	        if ser.errors:
	            return JsonResponse({"mesg":"error"})
	        ser.save()
	        return JsonResponse({"mesg":"ok"})

   	 	def put(self,request):
	        book=BookInfo.objects.get(id=8)
	        data=request.body.decode()
	        data_dict=json.loads(data)
	        ser=BookSerilizer(book,data_dict)
	        ser.is_valid()
	        print(ser.errors)
	        ser.save()
	        return JsonResponse({"mesg":"儲存成功"})