Django笔记(六):DRF框架

前后端分离是互联网应用开发的标准使用方式,让前后端通过接口实现解耦,能够更好的进行开发和维护。

RESTful接口常见规范

在接口设计中,大家遵循一定的规范可以减少很多不必要的麻烦,例如url应有一定辨识度,可以加入api等关键词,路径中尽量不要含有动词,根据请求方式对业务逻辑进行划分等等,如:

请求方式数据库操作描述
GETSELECT获取数据
POSTCREATE添加数据
PUTUPDATE更新数据
DELETEDELETE删除数据

DRF安装

安装命令:

pip install djangorestframework

settings.py注册:

INSTALLED_APPS = ["rest_framework",...
]

视图编写

app/views.py

from rest_framework.views import APIView
from rest_framework.response import Responseclass IndexView(APIView):def get(self, request):res = dict()res['mes'] = "success"res['data'] = 123return Response(res)

视图函数变成了视图类,需要继承APIView。可在类内部分别定义get,post等请求函数,视图会根据请求方式映射不同处理函数。

路由配置

每条路由对应一个视图函数,故需将视图类转为视图函数

urls.py

from django.contrib import admin
from django.urls import path
from app1 import viewsurlpatterns = [path('admin/', admin.site.urls),path('index/', views.IndexView.as_view()),
]

访问指定路由后:

 DRF框架自带的接口界面很好看,也便于调试。

序列化操作

将数据库数据整理为接口返回数据的过程很繁琐,DRF简化了序列化操作。

定义model,/app/models.py

from django.db import models# Create your models here.
class Player(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=20)

定义了player模型,两个字段id和name。为了方便后台操作,我们将其进行admin注册(app/admin.py)

from django.contrib import admin
from app.models import Player
# Register your models here.admin.site.register(Player)

记得进行数据迁移!!!之后便可在admin管理界面看到Player表格,登录admin管理系统需要创建用户,创建命令:

python manage.py createsuperuser

按提示注册后,登录admin管理界面:

可以看到创建的表格,手动添加两条数据。如果我们希望返回所有player信息,视图应该这么写(app/views.py):

from rest_framework.views import APIView
from rest_framework.response import Response
from app1.models import Playerclass PlayersView(APIView):def get(self, request):players = Player.objects.all()res = list()for p in players:t = dict()t["id"] = p.idt["name"] = p.nameres.append(t)return Response(res)

 字段较少的时候无妨,字段太多的时候,这是个让人抓狂的操作。

可以先编写一个序列化类(app/serializer.py):

from rest_framework import serializers
from app1.models import Playerclass PlayersModelSerializer(serializers.ModelSerializer):class Meta:model=Player# fields="__all__"fields = ("id", "name")

此类用于对Player进行序列化,Meta类中只需指明指定模型,以及想要序列化的字段即可,fields的all参数指所有字段。

视图修改(app/views.py):

from rest_framework.views import APIView
from rest_framework.response import Response
from app1.models import Player
from app1.serializers import PlayersModelSerializerclass PlayersView(APIView):def get(self, request):players = Player.objects.all()# 创建序列化对象,many指多条数据players_json = PlayersModelSerializer(players, many=True)print(players_json.data)# data返回序列化后的数据return Response(players_json.data)

设置路由后,访问结果:

ModelSerializer只是对模型进行序列化,如果对其以外复杂结构进行序列化,可以继承Serializer类,逐个字段进行手动编写,以及序列化嵌套等等,不在赘述。

Mixins类改进

Django的mixins实现了各种功能让其他函数继承,能够让用户用更少的代码操作模型,一般会配合GenericAPIView使用,Mixin有五类:

描述请求方法
ListModelMixin返回查询集列表,提供list方法GET
CreateModelMixin创建实例,提供create()方法POST
RetrieveModelMixin返回一个具体实例,提供retrieve()方法GET
UpdateModelMixin更新实例,提供update()方法PUT、PATCH
DestoryModelMixin删除实例,提供delete()方法DELETE

同样实现上面返回player列表的功能,视图可以这样写(app/views.py):

from rest_framework import mixins, generics
from app1.models import Player
from app1.serializers import PlayersModelSerializerclass PlayersView(mixins.ListModelMixin, generics.GenericAPIView):queryset = Player.objects.all()serializer_class = PlayersModelSerializerdef get(self, request):return self.list(request)

queryset和serializer_class是要操作的数据集合序列化类,GenericAPIView需要的参数。因为ListModelMixin提供了list函数,get请求视图的返回结果可以直接调用。这里的执行结果与上面相同。(如果queryset需要条件查询,需要重写get_queryset函数。

如果是添加数据,则:

from rest_framework import mixins, generics
from app1.models import Player
from app1.serializers import PlayersModelSerializerclass PlayersView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):queryset = Player.objects.all()serializer_class = PlayersModelSerializerdef get(self, request):return self.list(request)def post(self, request):return self.create(request)

提供name参数即可添加成功。

另外三个Mixin类使用相同,因为要对指定数据进行修改,故需提供词条数据的pk(主键)来找到此条数据。(app/views.py)

class PlayerDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,generics.GenericAPIView):queryset = Player.objects.all()serializer_class = PlayersModelSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)

路由需要提供pk参数:(urls.py)

urlpatterns = [path("players/<int:pk>/", views.PlayerDetailView.as_view()),...
]

如果想要通过其他字段查找数据,需要提供lookup_field参数,指明要查找的字段(查询结果多于一条时会报错)

class PlayerDetailView(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,generics.GenericAPIView):queryset = Player.objects.all()serializer_class = PlayersModelSerializerlookup_field = "name"def get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)
urlpatterns = [path("players/<name>/", views.PlayerDetailView.as_view()),...
]

 GenericAPIView类

GenericAPIView还有许多子类,直接将Mixins和GenericAPIView进行了组合,有这么多:

提供方法

CreateAPIView

post
ListAPIViewget
RetrieveAPIViewget
DestroyAPIViewdelete
UpdateAPIViewput, patch
ListCreateAPIViewget, post
RetrieveUpdateAPIViewget, put, patch
RetrieveDestroyAPIViewget, delete, patch
RetrieveUpdateDestroyAPIViewget, put, delete, patch

 上面的试图类可以这么写:

class PlayerDetailView(generics.RetrieveUpdateDestroyAPIView):queryset = Player.objects.all()serializer_class = PlayersModelSerializerlookup_field = "name"

言简意赅。

自定义返回数据

DRF提供了自定义返回类,可以自己编写,也可以硬往里赛东西,比如:

def get(self, request, *args, **kwargs):res = dict()res["mes"] = "success"res["data"] = self.list(request, *args, **kwargs).datareturn Response(res)

把原来Response中的data取出来,重新塞点东西再返回。

分页

 DRF有三个分页方式,这里说一个PageNumberPagination,创建一个分页类(app/paginations.py):

from rest_framework.pagination import PageNumberPaginationclass PlayerPagination(PageNumberPagination):page_size = 2 # 每页显示的数据数量max_page_size = 4 # 每页最多显示的数据数量page_size_query_param = "size" # 显示数量的变量名page_query_param = "page" # 页数的变量名"""如果访问localhost/player/?page=2&size=3,则会返回以三条数据分页的第二页内容"""

用户视图(app/views.py):

from rest_framework import mixins, generics
from app1.models import Player
from app1.serializers import PlayersModelSerializer
from app1.paginations import PlayerPaginationclass PlayersView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):queryset = Player.objects.all()serializer_class = PlayersModelSerializerpagination_class = PlayerPaginationdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)

 尾

一般APIView配合序列化就能很好开发接口,Mixins和GenericAPIView少不了几行代码,且queryset和response部分限制较多,自定义覆盖原方法的代码也就差不多把少的几行代码补回了,如果需要分页功能,可以用GenericAPIView编写。

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

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

相关文章

电信宽带配置动态域名和端口映射

需求: 家宽映射动态域名访问内网服务 动态域名:18081>电信光猫:18081>Openwrt软路由:18081>主机192.168.3.172:8081 目前网络结构&#xff1a; 电信光猫192.168.1.1 Openwrt软路由192.168.3.1 主机192.168.3.172上8081端口起了一个nginx-docker服务 前置条件&#x…

HarmonyOS自定义弹出对话框CustomDialog并传递变量

HarmonyOS定义了一系列弹窗反馈类的组件​ 和前端开发框架VUE3配套生态库element plus中的提供各种组件相比&#xff0c;还是要少一些。可能是手机端操作和PC端操作的差异导致的​ 如果内置的弹窗不满足要求&#xff0c;可以基于CustomDialog自定义出各种个性化的反馈组件。 首…

【开源】基于JAVA语言的假日旅社管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

【自动化测试】Pytest+Appium+Allure 做 UI 自动化的那些事

文本主要介绍下 PytestAllureAppium 记录一些过程和经历。 法主要用了啥: Python3 Appium Allure-pytest Pytest Appium 不常见却好用的方法 Appium 直接执行 adb shell 方法 #Appium 启动时增加 --relaxed-security 参数 Appium 即可执行类似adb shell的方法 appium -p 4…

蓝凌OA sysUiExtend.do 任意文件上传漏洞复现

0x01 产品简介 蓝凌核心产品EKP平台定位为新一代数字化生态OA平台,数字化向纵深发展,正加速构建产业互联网,对企业协作能力提出更高要求,蓝凌新一代生态型OA平台能够支撑办公数字化、管理智能化、应用平台化、组织生态化,赋能大中型组织更高效的内外协作与管理,支撑商业…

TCP 异常断开连接【重点】

参考链接 https://xiaolincoding.com/network/3_tcp/tcp_down_and_crash.html https://xiaolincoding.com/network/3_tcp/tcp_unplug_the_network_cable.html#%E6%8B%94%E6%8E%89%E7%BD%91%E7%BA%BF%E5%90%8E-%E6%9C%89%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93 关键词&#xff1a…

2023 IoTDB Summit:中核武汉核电运行技术股份有限公司主管工程师方华建《IoTDB在核电数字化转型过程的应用实践》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

代码随想录 Leetcode637. 二叉树的层平均值

题目&#xff1a; 代码(首刷自解 2024年1月24日&#xff09;&#xff1a; class Solution { public:vector<double> averageOfLevels(TreeNode* root) {vector<double> res {};if(root nullptr) return res;queue<TreeNode*> que;TreeNode* cur root;que…

Linux简介

Unix的特点&#xff1a; Unix很简洁&#xff0c;Unix只提供几百个系统调用&#xff0c;并且每个调用都有明确的目的。一切皆文件&#xff0c;对数据和对文件都是通过相同的系统调用接口&#xff1a;open&#xff08;&#xff09;&#xff0c;read&#xff08;&#xff09;&…

Vue2 - keep-alive 作用和原理

目录 1&#xff0c;介绍和作用2&#xff0c;原理3&#xff0c;使用场景3.1&#xff0c;效果展示3.2&#xff0c;实现思路 1&#xff0c;介绍和作用 <!-- 非活跃的组件将会被缓存&#xff01; --> <keep-alive><component :is"activeComponent" />…

hadoop集群规划部署

一、集群规划 三台硬件资源&#xff0c;部署hadoop版本&#xff0c;hadoop-3.3.5 &#xff0c;部署后配置文件。 Hadoop配置文件分两类&#xff1a;默认配置文件和自定义配置文件。 hadoop102hadoop103hadoop104HDFS NameNode DataNode DataNode SecondaryNameNode DataN…

如何在 Ubuntu 20.04 上安装 Nginx

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装 Nginx 介绍 Nginx是世界上最受欢迎的 Web 服务器之一&#xff0c;负责托管互联网…