开发实践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.mzph.cn/news/635290.shtml

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

相关文章

java使用AES加密数据库解密

目录 前言代码加密&#xff08;AES&#xff09;sql解密 前言 在一些项目中&#xff0c;客户要求一方面把一些敏感信息进行加密存储到数据库中&#xff0c;另一方面又需要通过加密的信息进行查询&#xff0c;这时就需要在sql对加密的字段进行解密后再进行查询。 代码加密&#x…

数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)二

第五部分、数组和广义表详解 数组和广义表&#xff0c;都用于存储逻辑关系为“一对一”的数据。 数组存储结构&#xff0c;99% 的编程语言都包含的存储结构&#xff0c;用于存储不可再分的单一数据&#xff1b;而广义表不同&#xff0c;它还可以存储子广义表。 本章重点从矩阵…

对多种股权激励方式进行分析,明确按照业绩贡献确定激励对象

一、背景 某生物创新材料有限公司创立于1990年&#xff0c;坐落于成都某高新技术产业开发区&#xff0c;是一家以研发、生产和销售医疗器械、医用高分子材料、生物技术等生物、能源方面的产品为主的大型企业&#xff0c;该公司与美国某科技研究所结成合作伙伴&#xff0c;研发出…

[python语言]数据类型

目录 知识结构​编辑 复数类型 整数类型、浮点数类型 1、整型 2、浮点型 字符与字符串 1、转义字符 2、字符串的截取 3、字符串的拼接级连 4、字符串的格式化 1、format格式化 2、字符格式化 3、f标志位格式化--(推荐) 5、字符串的常用属性 1、对字符串做出判断…

电脑上怎么进行pdf合并?这几招分分钟解决

电脑上怎么进行pdf合并&#xff1f;在现代办公中&#xff0c;PDF文件已经成为了我们处理文档的常用格式之一。有时候&#xff0c;我们需要将多个PDF文件合并成一个文件&#xff0c;以方便阅读或打印。那么&#xff0c;如何在电脑上进行PDF合并呢&#xff1f;下面就给大家介绍几…

知识图谱的演进

目录 前言1 Memex&#xff1a;信息存储的雏形2 超文本和Web&#xff1a;链接的崛起3 Semantic Web&#xff1a;从文本链接到数据链接4 Linked Big Data&#xff1a;规范化的语义表示5 谷歌的知识图谱搜索引擎6 多种语义网/知识图谱项目结语 前言 随着人工智能和互联网的飞速发…

Keil下载芯片包(DFP)时找不到根目录的解决办法

目录 1 发现的问题 2 想到的可能解决问题的措施 1 发现的问题 打开Keil时Pack Installer 自动打开下载芯片包&#xff0c;但弹出如下提示&#xff0c;无法下载&#xff1a; Refresh Pack description E: the specified CMsls Pack Root directorydoes NoT exist! Please tak…

go语言(一)----声明变量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后&#xff0c;结果如下&#xff1a; 1、golang表达式中&#xff0c;加&#xff1b;和不加&#xff1b;都可以 2、函数的{和函数名一…

眼镜用超声波清洗机洗会有损坏吗?超声波清洗机有必要买吗

相信很多朋友都十分清楚超声波清洗机&#xff0c;虽然知道但是迟迟不敢下手入一款属于自己超声波清洗机&#xff01;会担心超声波清洗机会不会把自己的眼镜给清洗坏了呢&#xff1f;什么样的超声波清洗机比较适合我呢&#xff1f;买一台超声波清洗机回来真的有必要吗&#xff1…

小程序系列--9.生命周期

1. 什么是生命周期&#xff1f; 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 6. 页面的生命周期函数

ASP.NET Core 对象池化技术

写在前面 Microsoft.Extensions.ObjectPool 是 ASP.NET Core 基础结构的一部分&#xff0c;当对象的初始化成本较高&#xff0c;并且可能被频繁使用时&#xff0c;才适合采用对象池技术&#xff1b;被ObjectPool管理的对象不会进入垃圾回收&#xff0c;使用时通过由实例对象实…

记录Qt和opencv 新环境配置过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Qt是什么&#xff1f;二、Qt的版本三、安装步骤1.下载Qt2.双击安装包.exe开始安装3. 需要登陆才能继续安装&#xff0c;没有的就用邮箱注册账号4.注意安装路…

Message queue 消息队列--RabbitMQ 【基础入门】

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…

Docker进阶篇-安装MySQL主从复制

一、MySQL主服务器 1、新建主服务器容器实例3307 docker run -p 3307:3306 \--name mysql-master \--privilegedtrue \-v /mydata/mysql-master/log:/var/log/mysql \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/conf:/etc/mysql \-e MYSQL_ROOT_…

Linux编辑器---vim

目录 1、vim的基本概念 2正常/普通/命令模式(Normal mode) 2、1命令模式下一些命令&#xff08;不用进入插入模式&#xff09; 3插入模式(Insert mode) 4末行/底行模式(last line mode) 4、1底行模式下的一些命令 5、普通用户无法进行sudo提权的解决方案 6、vim配置问题 6、1配…

基于 Redis 实现高性能、低延迟的延时消息的方案演进

1、前言 随着互联网的发展&#xff0c;越来越多的业务场景需要使用延迟队列。比如: 任务调度:延时队列可以用于任务调度&#xff0c;将需要在未来某个特定时刻执行的任务放入队列中。消息延迟处理: 延时队列可以用于消息系统&#xff0c;其中一些消息需要在一段时间后才能被消…

RK3568平台 HDMI交换机芯片PI3HDX231

一.简介 HDMI交换机芯片是一款可以同时输入几路HDMI的芯片&#xff0c;通过设计交换机芯片的寄存器值&#xff0c;已选择 其中一路作为输出。 I3HDX231是3:1 HDMI线性ReDriver交换机&#xff0c;支持每通道6 Gbps的数据速率&#xff0c;4096 x 2160像素分辨率&#xff0c;彩色…

Python项目——搞怪小程序

1、介绍 使用python编写一个小程序&#xff0c;回答你是猪吗。 点击“是”提交&#xff0c;弹窗并退出。 点击“不是”提交&#xff0c;等待5秒&#xff0c;重新选择。 并且隐藏了关闭按钮。 2、实现 新建一个项目。 2.1、设计UI 使用Qt designer设计一个UI界面&#xff0c…

深入解析JavaScript中箭头函数的用法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 箭头函数(Arrow function)是JavaScript ES6中引入的一大特性。箭头函…

739.每日温度 496.下一个更大元素 I

739.每日温度 496.下一个更大元素 I 739.每日温度 力扣题目链接(opens new window) 请根据每日 气温 列表&#xff0c;重新生成一个列表。对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位…