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":"儲存成功"})