开发实践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 //

from django.db import modelsclass 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@classmethoddef get_all(cls):return cls.objects.all()

admin //

from django.contrib import adminfrom rest_app.models import Studentsadmin.site.register(Students
)

app下serializer.py //

from rest_framework import serializersfrom rest_app.models import Studentsclass StudentSerializer(serializers.ModelSerializer):  # 自定义一个用于序列化student模型的序列化类class Meta:model = Studentsfields = ("id","name","age","gender","gpa",)

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

views //

from rest_framework.decorators import api_view
from rest_framework.response import Responsefrom 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 //

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 //

@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

@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_namedef __str__(self):return self.class_name@classmethoddef get_all(cls):return cls.objects.all()

admin //

from django.contrib import adminfrom rest_app.models import Students, StudentsClamodels = [Students,StudentsCla
]admin.site.register(models)

serializer //

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

views //

class ListStudentsClaViewSet(ModelViewSet):queryset = StudentsCla.get_all()  # 使用模型视图集需要指定queryset的值和s_cserializer_class = StudentsClaSerializerpass

total urls //

from rest_framework import routersfrom rest_app.views import ListStudentsClaViewSetrouter = 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")@classmethoddef 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):passreturn 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):passreturn render(self.request, "", locals())def put(self, request):passdef 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 modelsclass Stu(models.Model):name = models.CharField(max_length=32, verbose_name="name")gpa = models.IntegerField(verbose_name="gpa")@classmethoddef 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 = Stufields = ("name","gpa",)

views //

class ListALLStudentsView(ListCreateAPIView):queryset = Stu.get_all()serializer_class = StuSerializerclass SingleStu(RetrieveUpdateDestroyAPIView):queryset = Stu.get_all()serializer_class = StuSerializerlookup_url_kwarg = "name"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用VSCode玩STM32的烧录工具 CooCox Cortex Flash Programmer

一、下载软件 经热心兄弟推荐的版本&#xff0c;不知道有没有版权&#xff0c;如有版权问题&#xff0c;请通知删除。 CSDN - 0积分下载&#xff1a;https://download.csdn.net/download/qq_49053936/88744187 二、生成bin文件 插件不同&#xff0c;方法有所不同&#xff0c;各…

云轴科技ZStack位列IDC云系统软件市场教育行业TOP2

近日&#xff0c;全球IT市场研究和咨询公司IDC发布 《中国云系统软件市场跟踪报告2023H1》 ZStack作为产品化的云基础软件提供商 位居云系统软件市场第一梯队 市场份额位列独立云厂商*第一 增速最快 教育行业TOP2 在教育行业&#xff0c;云计算已成为教育行业信息化的重要基础…

C++PythonC# 三语言OpenCV从零开发(3):图像读取和显示

文章目录 相关链接前言Mat是什么读取图片CC#Python 灰度处理CCSharpPython 打印图像信息CCsharpPython 总结 相关链接 C&Python&Csharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程&#xff08;附带课程课件资料课件笔记&#xff09; …

python使用jupyter记笔记

目录 一、安装 二、运行jupyter 三、使用 四、记笔记 Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序&#xff0c;便于创建和共享程序文档&a…

debian12.4配置

文章目录 debian12.4配置概述笔记将非root用户添加到sudo组更换国内源配置ssh的客户端访问END debian12.4配置 概述 在虚拟机中装了一个debian12.4, 想配置ssh客户端连接, 出了问题. 配置乱了, 还好长了个心眼, 做了快照. 发现2个问题: debian12.4默认安装完, 有ssh, 先检查…

uni-app的学习【第三节】

五 运行环境判断与跨端兼容 uniapp为开发者提供了一系列基础组件,类似HTML里的基础标签元素,但uni-app的组件与HTML不同,而是与小程序相同,更适合手机端使用。 虽然不推荐使用 HTML 标签,但实际上如果开发者写了`div`等标签,在编译到非H5平台时也会被编译器转换为 `view`…

鸿蒙原生应用/元服务开发-延迟任务说明(一)

一、功能介绍 应用退至后台后&#xff0c;需要执行实时性要求不高的任务&#xff0c;例如有网络时不定期主动获取邮件等&#xff0c;可以使用延迟任务。当应用满足设定条件&#xff08;包括网络类型、充电类型、存储状态、电池状态、定时状态等&#xff09;时&#xff0c;将任务…

/var/run/yum.pid 已被锁定,PID 为 2762 的另一个程序正在运行解决方法

一、问题 /var/run/yum.pid 已被锁定&#xff0c;PID 为 2762 的另一个程序正在运行 二、原因 这个提示意味着在你的Linux系统中&#xff0c;有一个yum&#xff08;或者dnf&#xff0c;在较新版本的Fedora和RHEL/CentOS 8中&#xff09;进程正在运行&#xff0c;并且它已经创建…

使用JFLASH实现文件程序自动化合并及下载功能

主要总结下使用 SEGGER 工具集的 JFLASH 软件实现hex/bin文件合并以及程序的自动下载使用方法。 起因是最近使用到LVGL字库文件的制作&#xff0c;每次都要将分散的bin文件按既定分配的偏移作合并处理&#xff0c;刚开始使用的是二进制文件合并工具,文件少的时候还行&#xff…

AI短视频制作:创意与技术的完美结合

文章目录 一、充分了解AI技术的应用范围和优势二、创意策划&#xff0c;确定作品主题和风格三、素材收集&#xff0c;丰富作品内容四、特效制作&#xff0c;提升作品视觉效果五、配音处理&#xff0c;增强作品表现力六、作品发布&#xff0c;扩大作品传播范围《AI短视频制作一本…

Mybatis集成MySQL使用游标查询处理大批量数据

背景 基于数据的时间范围查询&#xff0c;给符合条件的用户推送积分即将到期的提醒。 初期用户量小使用最普通简单的分页查询扫描数据处理数据没问题。随着用户量的上升表数据已经上千万&#xff0c;每天扫描处理的数量也超百万&#xff0c;limit分页出现了慢sql&#xff0c;…

MacBookPro怎么数据恢复? mac电脑数据恢复?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 如果电脑回收站&#xff0c;或者是废纸篓里面的数据被清空了&…