开发实践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.rhkb.cn/news/243672.html

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

相关文章

C#,入门教程(07)——软件项目的源文件与目录结构

上一篇&#xff1a; C#&#xff0c;入门教程(06)——解决方案资源管理器&#xff0c;代码文件与文件夹的管理工具https://blog.csdn.net/beijinghorn/article/details/124895033 创建新的 C# 项目后&#xff0c; Visual Studio 会自动创建一系列的目录与文件。 程序员后面的工…

SERVLET API

SERVLET API Servlet API是用于创建servlet的java类和接口的集合。这些类和接口存放在javax.servlet和javax.servlet.http包中。 javax.servlet包 javax.servlet包的类和接口用于servlet和客户机之间的通信。创建servlet时,需要直接或通过扩展实现Servlet接口的类来实现Serv…

从传统管理到数字化转型——易点易动固定资产管理系统的应用

在数字化时代&#xff0c;企业管理正迎来一场革命性的转变。固定资产管理作为企业管理的重要组成部分&#xff0c;也需要适应数字化转型的潮流。易点易动固定资产管理系统作为一项先进的数字化工具&#xff0c;为企业提供了高效、便捷的资产管理解决方案。本文将介绍易点易动固…

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络 Fedora包含的软件以自由及开放源码许可来发布&#xff0c;并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台下…

【爬虫、数据可视化实战】以“人口”话题为例爬取实时微博数据并进行舆情分析

前言&#xff1a; 近期在weibo上讨论的比较热的话题无非就是“人口”了。TaoTao也看了一些大家发的内容。但是感觉单纯的看文字内容不能很直观的反应出来大家的关切。索性就使用爬虫对数据进行爬取&#xff0c;同时结合着数据可视化的方式让数据自己开口说话。那么接下来就让我…

单片机中MCU跑RTOS相比裸机的优势

经常有读者问关于RTOS的问题&#xff0c;比如&#xff1a;我现在要不要学习RTOS&#xff1f; 学习RTOS有什么好处&#xff1f; 我的项目要不要跑RTOS&#xff1f; 问这些问题&#xff0c;其实归根结底还是对RTOS理解的不够&#xff0c;项目开发的经验还不足等。针对这部分朋友…

鸿蒙自定义刷新组件使用

前言 DevEco Studio版本&#xff1a;4.0.0.600 1、RefreshLibrary_HarmonyOS.har&#xff0c;用于HarmonyOS "minAPIVersion": 9, "targetAPIVersion": 9, "apiReleaseType": "Release", "compileSdkVersion": "3.…

OpenHarmonyOS-gn与Ninja

GN语法及在鸿蒙的使用 [gnninja学习 0x01]gn和ninja是什么 ohos_sdk/doc/subsys-build-gn-coding-style-and-best-practice.md GN 语言与操作 一、gn简介 gn是generate ninja的缩写&#xff0c;它是一个元编译系统&#xff08;meta-build system&#xff09;,是ninja的前端&am…

[AutoSar]BSW_OS 06 Autosar OS_Alarms

一、 目录 一、关键词平台说明一、Timer1.1 配置1.2Periodical Interrupt Timer (PIT)和High Resolution Timer (HRT) 二、Alarm 工作机制三、Code3.1创建一个15ms的runnable3.2mapping到basic task3.3生成代码 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueO…

k8s学习-Deployment

Kubernetes通过各种Controller来管理Pod的生命周期 。 为了满足不同业 务 景 &#xff0c; Kubernetes 开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。我们⾸先学习最常用Deployment。 1.1 Kubectl命令直接创建 第一种是通过kubectl命令直接…

R2DBC-响应式数据库

简单查询 基于全异步,响应式,消息驱动 用法: 1.导入驱动:导入连接池(r2dbc-pool),导入驱动(r2dbc-mysql) 2. 使用驱动提供的api操作 pom.xml <properties><r2dbc-mysql.version>1.0.5</r2dbc-mysql.version> </properties><dependencies><d…

实验:MySQL 客户端SocketTimeout 抓包分析

实验准备 服务端环境准备 服务器信息 阿里云 99 大洋白嫖机 $ cat /proc/version Linux version 5.15.0-83-generic (builddlcy02-amd64-027) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #92-Ubuntu SMP Mon Aug 14 09:30:42 UT…

Rocky Linux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

《WebKit 技术内幕》学习之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构&#xff0c;也就是说网页是可以分层的&#xff0c;这有两点原因&#xff0c;一是为了方便网页开发者开发网页并设置网页的层次&#xff0c;二是为了WebKit处理上的便利&#xff0c;也就是…

【表情识别阅读笔记】Towards Semi-Supervised Deep FER with An Adaptive Confidence Margin

论文名&#xff1a; Towards Semi-Supervised Deep Facial Expression Recognition with An Adaptive Confidence Margin 论文来源&#xff1a; CVPR 发表时间&#xff1a; 2022-04 研究背景&#xff1a; 对大量图片或视频进行手工标注表情是一件极其繁琐的事情&#xff0c;因此…

TCP高并发服务器简介(select、poll、epoll实现与区别)

select、poll、epoll三者的实现&#xff1a; select实现TCP高并发服务器的流程&#xff1a; 一、创建套接字&#xff08;socket函数&#xff09;&#xff1a;二、填充服务器的网络信息结构体&#xff1a;三、套接字和服务器的网络信息结构体进行绑定&#xff08;bind函数&…

2024 前端高频面试题之 HTML/CSS 篇

【前言】随着市场的逐渐恶劣&#xff0c;通过总结面试题的方式来帮助更多的coder&#xff0c;也是记录自己的学习过程&#xff0c;温故而知新。欢迎各位同胞大大点评补充~ 前端面试题之 HTML/CSS 篇 1、HTML 语义化&#xff1f;2、块级元素&内联样式3、盒子模型的理解&…

qml 2.8 布局练习

GreenSquare.qml import QtQuickRectangle {width: 100height: 100color: greenborder.color: Qt.lighter(color) } BlueSquare.qml import QtQuickRectangle {color: bluewidth: 50height: 50border.color: Qt.lighter(color)property alias text: label.text //将text开…

linux C语言socket函数send

在Linux中&#xff0c;使用C语言进行网络编程时&#xff0c;send函数是用于发送数据到已连接的套接字的重要函数之一。它通常用于TCP连接&#xff0c;但也可以用于UDP&#xff08;尽管对于UDP&#xff0c;通常更推荐使用sendto&#xff0c;因为它允许你指定目标地址和端口&…

Git学习笔记(第8章):IEAD实现GitHub操作(VSCode)

目录 8.1 VSCode登录GitHub账号 8.2 创建远程库 8.3 本地库推送到远程库(push) 8.4 远程库拉取到本地库(pull) 8.5 远程库克隆到本地库(clone) 8.1 VSCode登录GitHub账号 Step1&#xff1a;安装“GitHub Pull Requests and Issues”插件 Step2&#xff1a;登录GitHub账号 …