什么是RESTFUL
Representational State Transfer的缩写,翻译是"表现层状态转化"。
如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
RESTFUL规定了apis的类型及其对应的作用,还规定了路由的命名方式。
RESTFUL架构
Django Restful Framework
可以帮我们快速编写基于Restful的python框架
使用方式:
首先根据我们写好的models.py,编写各实体对应的序列化器:
# serializer.py
from rest_framework import serializers
#这是从models.py里面导出来的实体类
from backend.models import UserInfo, Document
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo # 序列化的对象名
fields = '__all__' # 序列化的字段名,或者指定字段 fields = ("id","name","age")
class DocumentSerializer(serializers.ModelSerializer):
class Meta:
model = Document # 序列化的对象名
fields = '__all__' # 序列化的字段名,或者指定字段 fields = ("id",
# "name","age")
在urls.py之中:
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
之后便可以在views.py之中开发了:
@api_view(['GET', 'POST'])
def document_list(request):
"""
该方法用于获取Document列表的数据或者是更新某一列Document
:param request: HTTP请求
:return: 序列化的Document的集合
"""
# 用于获取Document列表
if request.method == 'GET':
start_index = int(request.GET.get('startIndex')) # 表示请求的Document列表的起始序号
end_index = int(request.GET.get('endIndex')) # 表示请求的Document列表的结束序号
documents = Document.objects.filter(owner_id=request.COOKIES.get('user_id'))[start_index:end_index]
document_list_serializer = DocumentSerializer(documents, many=True) # 将结果集序列化
response = Response(document_list_serializer.data)
if not request.COOKIES.__contains__('total'): # 如果还没设置过表示总数的cookies则设置一次
total_num = Document.objects.filter(owner_id=request.COOKIES.get('user_id')).count()
response.set_cookie('total', total_num)
return response
# 用于更新Document对象
elif request.method == 'POST':
request.data['owner'] = request.COOKIES.get('user_id')
request.data['status'] = 1
request.data['lastModifiedDate'] = ''
document_list_serializer = DocumentSerializer(data=request.data)
if document_list_serializer.is_valid():
document_list_serializer.save()
response = Response(document_list_serializer.data, status=status.HTTP_201_CREATED)
response.set_cookie('total', int(request.COOKIES.get('total')) + 1)
return response
return Response(document_list_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
def document_detail(request, pk):
"""
对Document对象具体细节的更新
:param request: HTTP请求
:param pk: 要处理的对象的主键
:return: HTTP Response
"""
try:
document = Document.objects.get(id=pk) # 获取要操作的对象
except Document.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
document_serializer = DocumentSerializer(document)
return Response(document_serializer.data)
elif request.method == 'PUT': # 更新Document
document_serializer = DocumentSerializer(document, data=request.data)
if document_serializer.is_valid():
document_serializer.save()
return Response(document_serializer.data)
return Response(document_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE': # 删除Document
document.delete()
response = Response(status=status.HTTP_204_NO_CONTENT)
response.set_cookie('total', int(request.COOKIES.get('total')) - 1)
return response