开发实践8_REST

一、Django REST Framework, Django View & APIView

MTV模式实现前后端分离。Representational State Transfer 表现层状态转化。Representation 资源(Resource a specific info. on net.)具体呈现形式。ST 修改服务端的数据。修改数据 == POST请求。实现: 安装依赖 pip install djangorestframework / 序列化 / 视图装饰器 / 视图集

pip install djangorestframework

pip install httpie

python manage.py startapp rest_app

setting注册

复制代码
path('rest_app/', include('rest_app.urls', namespace='rest')),

models //

python 复制代码
from django.db import models


class Students(models.Model):
    name = models.CharField(max_length=32, verbose_name="NAME")
    age = models.IntegerField(verbose_name="AAAAGE")
    gender = models.CharField(max_length=2, verbose_name="GENDER")
    gpa = models.FloatField(verbose_name="BASIS")

    class Meta:
        verbose_name = "Students"
        verbose_name_plural = verbose_name + 'S'

    def __str__(self):
        return self.name

    @classmethod
    def get_all(cls):
        return cls.objects.all()

admin //

python 复制代码
from django.contrib import admin

from rest_app.models import Students


admin.site.register(
    Students
)

app下serializer.py //

python 复制代码
from rest_framework import serializers

from rest_app.models import Students


class StudentSerializer(serializers.ModelSerializer):  # 自定义一个用于序列化student模型的序列化类
    class Meta:
        model = Students
        fields = (
            "id",
            "name",
            "age",
            "gender",
            "gpa",
        )

序列化:继承djangorestframework中的serialize。str(a dict), 是一个jason字符串。

views //

python 复制代码
from rest_framework.decorators import api_view
from rest_framework.response import Response

from rest_app.models import Students
from rest_app.serializer import StudentSerializer


@api_view(["GET"])
def students_view(request):
    # 用不着render了,前端也不存在query set,所以需要序列化类
    students = Students.get_all()
    ser = StudentSerializer(students, many=True)
    return Response(ser.data)

视图装饰器。能接收什么样的请求。api_view。

urls //

python 复制代码
from django.urls import path
from .views import *

app_name = 'rest'

urlpatterns = [
    path('stuview/', students_view, name="stuview"),
]

用httpie来检测。

http get http://127.0.0.1:8000/rest/stuview

or postman.

Django rest post请求 put delete请求

views //

python 复制代码
@api_view(["GET", "POST"])
def students_view(request):
    # 用不着render了,前端也不存在query set,所以需要序列化类
    if request.method == "GET":
        students = Students.get_all()
        ser = StudentSerializer(students, many=True)
        return Response(ser.data)
    if 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)

id是自增的,所以不创建也可。建了也白建。但其他关键字在创建时不可省略。

postman:

post raw json

python 复制代码
@api_view(["GET", "PUT", "DELETE"])
def student_detail_view(request, sid):
    try:
        student = Students.get_one(sid)
    except Students.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == "GET":
        ser = StudentSerializer(student)
        return Response(ser.data)

    if request.method == "PUT":
        ser = StudentSerializer(student, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response(ser.data)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)

    if request.method == "DELETE":
        student.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

put 即使只修改一个字段也要写入所有字段

delete 不需要传,只需要send

二、Django REST 视图集

models //

复制代码
class StudentsCla(models.Model):
    class_name = models.CharField(max_length=32, verbose_name="NAMECLA")
    mentor = models.CharField(max_length=32, verbose_name="HEADTEACHER")

    class Meta:
        verbose_name = "CLA"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.class_name

    @classmethod
    def get_all(cls):
        return cls.objects.all()

admin //

复制代码
from django.contrib import admin

from rest_app.models import Students, StudentsCla

models = [
    Students,
    StudentsCla
]

admin.site.register(models)

serializer //

复制代码
class StudentsClaSerializer(serializers.ModelSerializer):  # 自定义一个用于序列化student模型的序列化类
    class Meta:
        model = StudentsCla
        fields = (
            "class_name",
            "mentor",
        )

views //

复制代码
class ListStudentsClaViewSet(ModelViewSet):
    queryset = StudentsCla.get_all()  # 使用模型视图集需要指定queryset的值和s_c
    serializer_class = StudentsClaSerializer
    pass

total urls //

复制代码
from rest_framework import routers

from rest_app.views import ListStudentsClaViewSet

router = routers.DefaultRouter()
router.register('student_class', ListStudentsClaViewSet)
复制代码
path('', include(router.urls))

视图集是将一个视图函数转换成一个类,并继承ViewSet。结果的这个类即 类视图。

三、VIEW & API VIEW 类视图

常分三类。View类视图(django原生有的),APIView类视图(支持前后端分离),通用类视图。

View类视图:①继承View类,编写对应的请求方法,处理不同请求状态。②配置路由,使用as_view()。

演示:

python manage.py startapp view_app

注册

复制代码
path('view/', include('view_app.urls', namespace="view")),

models //

复制代码
class Stu(models.Model):
    name = models.CharField(max_length=32, verbose_name="name")
    gpa = models.CharField(verbose_name="gpa")

    @classmethod
    def get_all(cls):
        return cls.objects.all()

views //

复制代码
class ListStuView(View):
    def get(self, request):
        stus = Stu.get_all()
        return render(self.request, "", locals())

    def post(self, request):
        pass
        return render(self.request, "", locals())


class ListStuAPIView(APIView):
    def get(self, request):
        stus = Stu.get_all()
        return Response(status=status.HTTP_200_OK)

    def post(self, request):
        pass
        return render(self.request, "", locals())

    def put(self, request):
        pass

    def delete(self, request):
        pass

sub urls //

复制代码
urlpatterns = [
     path('view/', ListStuView.as_view(), name="list"),
]

通用类视图

Django Restful

①操作所有的model。继承ListCreateAPIView类,并添加queryset和serializer_class两个类属性

②操作单个model。继承RetrieveUpdateDestroyAPIView类,并添加queryset和serializer_class两个类属性

总路由 //

复制代码
path('view/', include('view_app.urls', namespace="view")),

models //

复制代码
from django.db import models


class Stu(models.Model):
    name = models.CharField(max_length=32, verbose_name="name")
    gpa = models.IntegerField(verbose_name="gpa")

    @classmethod
    def get_all(cls):
        return cls.objects.all()

url //

复制代码
app_name = "view"

urlpatterns = [
     path('view/', ListStuView.as_view(), name="list"),
     path('detail/<name>/', SingleStu.as_view()),
]

视图集不用写路由,但是类视图要写。

serializer //

复制代码
class StuSerializer(serializers.ModelSerializer):  # 自定义一个用于序列化student模型的序列化类
    class Meta:
        model = Stu
        fields = (
            "name",
            "gpa",
        )

views //

复制代码
class ListALLStudentsView(ListCreateAPIView):
    queryset = Stu.get_all()
    serializer_class = StuSerializer


class SingleStu(RetrieveUpdateDestroyAPIView):
    queryset = Stu.get_all()
    serializer_class = StuSerializer
    lookup_url_kwarg = "name"
相关推荐
爱吃羊的老虎13 小时前
【大模型】向量数据库:Chroma、Weaviate、Qdrant
数据库·语言模型
数据大魔方13 小时前
【期货量化实战】跨期套利策略:价差交易完整指南(TqSdk源码详解)
数据库·python·算法·github·程序员创富
l1t13 小时前
NineData第三届数据库编程大赛:用一条 SQL 解数独问题我的参赛程序
数据库·人工智能·sql·算法·postgresql·oracle·数独
大、男人13 小时前
python之contextmanager
android·python·adb
毕设源码-钟学长14 小时前
【开题答辩全过程】以 基于Python的车辆管理系统为例,包含答辩的问题和答案
开发语言·python
CCPC不拿奖不改名14 小时前
数据处理与分析:数据可视化的面试习题
开发语言·python·信息可视化·面试·职场和发展
液态不合群14 小时前
线程池和高并发
开发语言·python
旦莫15 小时前
Pytest教程:Pytest与主流测试框架对比
人工智能·python·pytest
数据大魔方15 小时前
【期货量化实战】螺纹钢量化交易指南:品种特性与策略实战(TqSdk完整方案)
python·算法·github·程序员创富·期货程序化·期货量化·交易策略实战
施嘉伟15 小时前
一次生产环境 SQL 不走索引的排查过程
数据库·sql