web开发的两种模式:
- 前后端分离模式-----对于Django框架,一般要求遵循REST(表现层状态转化)设计风格,在这个基础上,出现了一个DRF(Django+REST+FRAMEWORK)框架,是对Django的再次封装,这个框架可以帮助我们这些苦逼的程序员减少代码量,主要承担了一些权限认证,序列化与反序列化的操作。
- 前后端不分离------在此不再论述,本文主要针对前后端分离。
搭建DRF项目工程
- 准备工作:安装Python和Django,然后用命令 pip install djangorestframework安装框架包。
前后端分离中,后端开发人员的核心任务:序列化与反序列化
在PYcharm中的终端输入命令:
django-admin startproject demo
python manage.py startapp book_drf
INSTALLED_APPS = [
...
'rest_framework']
+ 在开发REST API接口时,我们在视图中需要做的最核心的事是:
将数据库数据序列化为前端所需要的格式,并返回;
将前端发送的数据反序列化为模型类对象,并保存到数据库中。
所以我们现在用DRF框架实现以下这个功能,感受一下。
实现验证和反序列化的步骤,序列化步骤类似,不再举例:
1-新建一个serializers.py文件,定义一个序列化的类作为序列化器,里面可以写一些验证的代码和反序列化的代码。
2-在views.py 文件实例化serializers.py中的类,实例化后可以调用序列化器的方法,说白了就是验证和反序列化操作单独放在一个文件,实例化对象去调用。
from user.models import BookInfo
from rest_framework import serializers
from django.http import JsonResponse
class BookSerilizer(serializers.Serializer):
btitle=serializers.CharField(max_length=20)
bpub_date=serializers.DateField()
bread = serializers.IntegerField(label='阅读量',default=0)
bcomment = serializers.IntegerField(label='评论量',default=0)
def validate(self, attrs):
bread = attrs['bread']
bcomment = attrs['bcomment']
if bread < bcomment:
raise serializers.ValidationError('阅读量小于评论量')
return attrs
def create(self, validated_data):
return BookInfo.objects.create(**validated_data)
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"})
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":"保存成功"})