django restframework 学习笔记


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使用

  1. 安装依赖
pip install httpie
  1. 使用
  • get
http -a 用户名:密码 http://.....
  • post
http -a 用户名:密码 POST http://.....
  • PUT
http -a 用户名:密码 POST http://.....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值