Representational State Transfer 表现成状态转化
概念
- 资源(resource)
就是网络上的一个实体,或则说网络上的一个具体信息 - 表现层(Representation)
“资源”是一种信息实体,我们把“资源”具体呈现出来的形式,叫做他的“表现层” - 状态转换(State Transfer)
如果客户端想要操作服务器,就必须通过特定的手段,让服务端发生”状态装换“。
应用
1. 安装依赖
pip install djangorestframework
2. 序列化类
APP下新建serializer.py来定义序列化类
# Author:Bai Hu zi
# Time:2021/3/4
from rest_framework import serializers
from my_app.models import Student
# 视图装饰器 调用类
class StudentSerializer(serializers.ModelSerializer): # 自定义一个序列化类,来序列化Student模型
class Meta:
model = Student # 指定需要序列化的模型
fields = (
"id",
"name",
"gender",
"age",
"score")
# 视图集 调用类
class StudentSetSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Student
fields = (
"id",
"name",
"gender",
"age",
"score"
)
# ApiView类视图 调用类
class StudentsApiViewSerializer(serializers.ModelSerializer):
# student = serializers.ReadOnlyField(source="student.name") # 反序列化时名字不进行序列化
class Meta:
model = Student
# fields = "__all__" # 序列化所有字段
fields = (
"id",
"name",
"gender",
"age",
"score"
)
3. url文件配置
# Author:Bai Hu zi
# Time:2021/3/4
from django.urls import path, include
from rest_framework import routers
from my_app.views.j_restframework import *
router = routers.DefaultRouter()
router.register("student", StudentViewSet)
urlpatterns = [
# 视图装饰器
path("rest/students/", rest_students), # http://39.105.213.238:8000/myapp/rest/students
path("rest/student/<sid>/", rest_students), # http://39.105.213.238:8000/myapp/rest/student/1
# 视图集
path("", include(router.urls)), # http://39.105.213.238:8000/myapp/student
# ApiView类视图
path("ApiView/student/", StudentApiView.as_view()), # http://39.105.213.238:8000/myapp/ApiView/student/
]
4 .视图中的使用
# Author:Bai Hu zi
# Time:2021/3/4
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from my_app.models import Student
from my_app.serializer import StudentSerializer, StudentSetSerializer, StudentsApiViewSerializer
# ------------------------------视图装饰器-----------------------------------------------------
@api_view(["GET", "POST"]) # 指定该视图支持哪些请求类型
def rest_students(request):
if request.method == "GET":
students = Student.objects.all()
ser = StudentSerializer(students, many=True)
return Response(ser.data, status=status.HTTP_200_OK)
elif request.method == "POST":
ser = StudentSerializer(data=request.data) # 获取请求提交的数据并序列化
if ser.is_valid(): # 判断请求提交数据是否合法
ser.save() # 将数据写入模型中
return Response(ser.data, status=status.HTTP_201_CREATED)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
@api_view(["GET", "PUT", "DELETE"])
def rest_student(request, sid=None):
try:
stu = Student.objects.get(pk=sid)
except Student.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == "GET":
if sid:
ser = StudentSerializer(stu)
return Response(ser.data)
else:
students = Student.objects.all()
ser = StudentSerializer(students, many=True)
return Response(ser.data, status=status.HTTP_200_OK)
elif request.method == "PUT":
ser = StudentSerializer(stu, data=request.data) # 修改数据,request必须提供除id以外所有需要序列化的字段
if ser.is_valid():
ser.save()
return Response(ser.data, status=status.HTTP_202_ACCEPTED)
else:
return Response(ser.data, status=status.HTTP_400_BAD_REQUEST)
elif request.method == "DELETE":
stu.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
# ------------------------------视图集-----------------------------------------------------
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSetSerializer
# ------------------------------ApiView类视图-----------------------------------------------------
class StudentApiView(APIView):
def get(self, request):
students = Student.objects.all()
ser = StudentsApiViewSerializer(students, many=True)
return Response(ser.data, status=status.HTTP_200_OK)
def post(self, request):
ser = StudentsApiViewSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data, status=status.HTTP_201_CREATED)
else:
return Response(ser.errors, status=status.HTTP_400_BAD_REQUEST)
辅助工具
Postman
httpie使用
- 安装依赖
pip install httpie
- 使用
- get
http -a 用户名:密码 http://.....
- post
http -a 用户名:密码 POST http://.....
- PUT
http -a 用户名:密码 POST http://.....