django rest framework 学习笔记2
注意:该文章部分摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除!
显示关联表的数据,本示例会显示所有的关联的数据信息
from rest_framework import serializers
from .models import Student
class StudentModelSerializer(serializers.ModelSerializer):class Meta:model = Studentfields = "__all__"
读取到的结果器数据关联的为数字,此时需要进行一些操作可以读到正确数据
方法1: source='字段名.关联属性值'
from rest_framework import serializers
from drf_app import models
# 文章的Serializer
class ArticleSerializer(serializers.ModelSerializer):category = serializers.CharField(source='category.name')class Meta:model = models.Articlefields = ['id','title','summary','content','category']
方法2 : 返回其属性值
from rest_framework import serializers
from . import models# 文章的Serializer
class ArticleSerializer(serializers.ModelSerializer):category = serializers.SerializerMethodField()class Meta:model = models.Articlefields = ['id', 'title', 'summary', 'content', 'category']def get_category(self, obj): # obj是表中的一行记录的对象return obj.category.name
显示choice类型字段的对应数据
# 方法1
status = serializers.CharField(source='get_status_display')
# 方法2
class Meta:def get_category(self,obj): #obj是表中的一行记录的对象return get_status_display()
认证&权限
权限选项:
- AllowAny # 容许所有用户
- IsAuthenticated # 仅通过认证的用户
- IsAdminUser # 仅管理员用户
- IsAuthenticatedOrReadOnly # 只有认证的用户可以完全操作,其他可以可读
# 全局认证&权限配置
REST_FRAMEWORK ={'DEFAULT_AUTHENTICATION_CLASSES':('rest_framework.authentication.BasicAuthentication', # Basic 认证'rest_framework.authentication.SessionAuthentication', # Session 认证),'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permission.IsAuthenticated' # 全局权限管理 登录的用户才可以访问), # 若无此配置,默认所有用户可以访问,rest_framework.permission.AllowAny
}# view 单个视图认证&权限
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIViewclass MyView(APIView):# 指定认证的方式 # 401 未认证 403 权限被禁止authentication_classes = (SessionAuthentication,BasicAuthentication)permission_classes = (IsAuthenticated)# url 文件配置# DRF自带的登录接口认证
path('api-auth/',include('rest_framework.urls')) # 登录接口的配置,已封装注销及登录接口
限流: 限制接口的访问频率,减少服务器的压力(反爬虫)
REST_FRAMEWORK ={# 限流,全局默认配置'DEFAULT_THROTTLE_CLASSES':['rest_framework.throttling.AnonRateThrottle','rest_framework.throttling.UserRateThrottle',],# 设置用户的访问频率,局部用户限制,通过使用UserRateThrottle来限制用户的访问频率'DEFAULT_THROTTLE_RATES': {# 时间周期 second/minute/hour/day'anon':'10/day' , # 未认证的用户 10/day'user':'1000/day' # 认证的用户 100/day}
}# 局部配置调用视图view
from rest_framework.throttling import UserRateThrottleclass MyView(APIView):# 限流,限制用户的访问频率throttle_classes = (UserRateThrottle)
限流类型
- AnonRateThrottle
- 限制所有匿名未认证的用户,使用IP区分
- 使用DEFAULT_THROTTLE_RATES['anon'] 来设置频率
- UserRateThrottle
- 限制认证用户,使用用户ID区分
- 使用DEFAULT_THROTTLE_RATES['anon'] 来设置频率
- ScopedRateThrottle
- 限制用户对于具体视图的访问频率,使用IP或ID区分
- 视图中使用throttle_scope 制定频率
全局配置
- DEFAULT_THROTTLE_CLASSES: 设置限流类型
- DEFAULT_THROTTLE_RATES: 设置限制的频率
过滤:使用列表数据过滤字段信息,可使用django-fitlter扩展支持
pip install django-filter # 安装过滤器
# 注册app
'django_filters'# 指定过滤器
REST_FRAMEWORK = {'DEFAULT_FILTER_BACKENDS':('django_filters.rest_framework.DjangoFilterBackend')
}
# 方式1 自定义字段过滤
filterset_fields = ('age',)
# 方法2 自定义过滤类
filterset_class = UserInfoFilterfrom app.models import UserInfo
from django_filters import rest_framework as filters
class UserInfoFilter(filters.FilterSet):"""自定义过滤器类"""# 自定义字段过滤min_age = filters.NumberFilter(field_name='age',lookup_expr='gte')max_age = filters.NumberFilter(field_name='age',lookup_expr='lte')# 关联字段需要 关联字段__属性 实现name = filters.CharFilter(field_name='user__name')class Meta:model = UserInfofields = ['name','age']
接口文档:DRF 自动生成网页版的接口文档,其生成的是继承APIView及其子类的视图
pip install coreapi # 安装依赖
# setting 配置
REST_FRAMEWORK = {# 接口文档配置'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema',
}# url 配置
from django.urls import path,include,re_path
from rest_framework.documentation import include_docs_urls
urlpatterns = [re_path(r'^docs/',include_docs_urls(title='接口文档'))
]
排序:DRF提供OrderingFilter可快速实现数据的指定方式排序
# 局部信息配置
serializer_class =xxxserializer
filter_backends = [OrderingFilter] # 指定排序的过滤器
ordering_fields = ('age''id') # 指定字段# 指定ordering参数字段对数据集进行排序 xxx/?ordering=age# 全局配置信息
REST_FRAMEWORK = {# 指定过滤器'DEFAULT_FILTER_BACKENDS':(# 指定django_filters的过滤器过滤'django_filters.rest_framework.DjangoFilterBackend',# 指定DRF自带的排序过滤器来进行数据排序'rest_framework.filters.OrderingFilter'),
}
分页:
# 全局配置
REST_FRAMEWORK = {# 分页 全局配置'DEFAULT_PAGINATION_CLASS':'rest_frame.pagination.PageNumberPagination','PAGE_SIZE': 10 # 每页数据量
}# 局部配置from rest_framework.pagination import PageNumberPaginationclass UserInfoPagination(PageNumberPagination):page_size = 5 # 每页数据量page_query_param = 'page' # 页面关键字参数,默认 'page'page_size_query_param = 'size' # 前端的每页面关键字参数 默认Nonemax_page_size = 100 # 每页的数据量的最大值class MyView(APIView):"""局部配置,可通过pagination_class属性实现不同的分页器"""pagination_class = UserInfoPagination
异常处理:
# setting 配置
REST_FRAMEWORK = {# 异常处理配置# 'EXCEPTION_HANDLER':'rest_framework.views.exception_handler',# 自定义异常的处理函数接口'EXCEPTION_HANDLER':'common.exception.my_exception_handler',
}# 自定义异常处理
from rest_framework.views import exception_handler,Response,statusdef custom_exception_handler(exc,context):response = exception_handler(exc,context)if response is not None:response.data['status_code'] = response.status_codeelse:data ={'error':'服务器出错了'}response =Response(data,status=status.HTTP_500_INTERNAL_SERVER_ERROR)return response
文件上传:
- ImageField # 上传图片
- FileField # 上传文件
# model 配置
class ImageModel(models.Model):# file = models.FileField() # 保存文件的字段file = models.ImageField() # 用于保存图片文件的字段class Meta:db_table = 'image'verbose_name = '图片'# serial 序列化
from rest_framework import serializers
from models import UserInfo,ImageModelclass ImageSerializer(serializers.ModelSerializer):'图片关联序列化'class Meta:model = ImageModelfields = '__all__'#setting 配置
# 指定文件上传存放的路径
MEDIA_ROOT = BASE_DIR / 'image'# 指定文件url的路径
MEDIA_URL = ''# view视图配置from .models import models,ImageModel
from rest_framework.viewsets import ModelViewSet,mixins,GenericViewSetfrom .serializers import ImageSerializer
class ImageView(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet):queryset = ImageModel.objects.all()serializer_class = ImageSerializer
文件的上传和获取下载方式自定义优化
from .models import models,ImageModel
from rest_framework.viewsets import ModelViewSet,mixins,GenericViewSet
from django.http import FileResponsefrom .serializers import ImageSerializer
class ImageView(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.ListModelMixin,GenericViewSet):queryset = ImageModel.objects.all()serializer_class = ImageSerializer# 上传文件优化,限制文件的上传大小def create(self, request, *args, **kwargs):pic = request.data.get('files')size,name,type = pic.size,pic.name,pic.content_typeif size>1024*30:return Response({'error':'图片不可以超过30kb'},status=status.HTTP_400_BAD_REQUEST)elif type not in ['image/png','image/jpg']:return Response({'error':'你上传的文件格式有问题'},status=status.HTTP_400_BAD_REQUEST)else:return super().create(request,*args,**kwargs)def retrieve(self, request, *args, **kwargs): # 照片获取下载pic = self.get_object()path = pic.files.pathreturn FileResponse(open(path),'rb')def get_image(request,name):path = MEDIA_ROOT / namereturn FileResponse(open(path,'rb'))# url 配置
urlpatterns = [re_path('image/(.+?)/',views.get_image)
]
相关文章:
django rest framework 学习笔记2
注意:该文章部分摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除! 显示关联表的数据,本示例会显示所有的关联的数据信息 from rest_framework import serializers from .models import Student class StudentM…...
第四篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:pyttsx3自动化脚本经典案例
传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、雏形示例代码二、扩展思路介绍三、批量处理文本示例代码四、自定义语音设置示例代码五、结合其他库和API示例代码六、语音交互系统示例代码七、多语言支持示例代码八、添加…...
model.train()和model.eval()两种模式的原理
1. model.train() 在使用 pytorch 构建神经网络的时候,训练过程中会在程序上方添加一句model.train(),作用是 启用 batch normalization 和 dropout 。 如果模型中有BN层(Batch Normalization)和 Dropout ,需要在 训练…...
docker的底层原理六: 联合文件系统(UnionFS)
Docker的底层存储原理基于联合文件系统(UnionFS)。 联合文件系统(UnionFS)是一种特殊的文件系统,它允许独立地叠加多个目录层,呈现给用户的是这些目录层的联合视图。这种结构使得在Docker中,不…...
【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数
本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…...
自养号测评低成本高效率推广,安全可控
测评的作用在于让用户更真实、清晰、快捷地了解产品以及产品的使用方法和体验。通过买家对产品的测评,也可以帮助厂商和卖家优化产品缺陷,提高用户的使用体验。这进而帮助他们获得更好的销量,并更深入地了解市场需求。因此,测评在…...
ubuntu22.04@laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module
ubuntu22.04laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 使用 OpenCV DNN 模块进行图像分类3.1 导入模块并加载类名文本文件3.2 从磁盘加载预训练 DenseNet121 模型3.3 读取图像并准备为模型输…...
【elk查日志 elastic(kibana)】
文章目录 概要具体的使用方式一:查找接口调用历史二:查找自己的打印日志三:查找错误日志 概要 每次查日志,我都需要别人帮我,时间长了总觉得不好意思,所以这次下定决心好好的梳理一下,怎么查日…...
RapidMiner数据挖掘2 —— 初识RapidMiner
本节由一系列练习与问题组成,这些练习与问题有助于理解多个基本概念。它侧重于各种特定步骤,以进行直接的探索性数据分析。因此,其主要目标是测试一些检查初步数据特征的方法。大多数练习都是关于图表技术,通常用于数据挖掘。 为此…...
基于STM32的光照检测系统设计
基于STM32的光照检测系统设计 摘要: 随着物联网和智能家居的快速发展,光照检测系统在智能环境控制中扮演着越来越重要的角色。本文设计了一种基于STM32的光照检测系统,该系统能够实时检测环境光强度,并根据光强度调节照明设备,实现智能照明控制。本文首先介绍了系统的总体…...
车辆管理系统设计与实践
车辆管理系统是针对车辆信息、行驶记录、维护保养等进行全面管理的系统。本文将介绍车辆管理系统的设计原则、技术架构以及实践经验,帮助读者了解如何构建一个高效、稳定的车辆管理系统。 1. 系统设计原则 在设计车辆管理系统时,需要遵循以下设计原则&…...
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 一、什么是HttpServletResponse二、响应数据的常用方法三、响应乱码问题字符流乱码字节流乱码 四、重定向:sendRedirect请求转发和重定向的区别 在上一节中,我们系统的学习了…...
漫谈:C/C++ char 和 unsigned char 的用途
C/C的字符默认是有符号的,这一点非常的不爽,因为很少有人用单字节表达有符号数,毕竟,ASCII码是无符号的,对字符的绝大多数处理都是基于无符号的。 这一点在其它编程语言上就好很多,基本上都提供了byte这种类…...
安全保护制度
安全保护制度 第九条 计算机信息系统实行安全等级保护。安全等级的划分标准和安全等级保护的具体办法,由公安部会同有关部门制定。 第十条 计算机机房应当符合国家标准和国家有关规定。 在计算机机房附近施工,不得危害计算机信息系统的安全。 第十一条 进行国际联网的计算…...
沁恒CH32V30X学习笔记07---多功能按键框架使用
多功能按键框架使用 参考开源框架: GitHub - 0x1abin/MultiButton: Button driver for embedded system 框架使用说明: ch32gpio基本驱动 https://blog.csdn.net/u010261063/article/details/136157718 MultiButton 简介 MultiButton 是一个小巧简单易用的事件驱动型按…...
如何看显卡是几G?
created: 2024-02-20T09:22:13 (UTC 08:00) tags: [] source: https://www.sysgeek.cn/windows-check-gpu-model/ author: 海猴子 6 种简单方法:如何在 Windows 中轻松查看显卡型号 - 系统极客 Excerpt 不确定你的显卡型号?使用这 6 个简单有效的方法&a…...
虚拟机--pc端和macOS端互通
windows开启虚拟化 要在Windows系统中开启虚拟化,您可以按照以下步骤操作: 准备工作: 确保您的计算机CPU支持虚拟化技术。在BIOS中开启相应的虚拟化支持。 开启虚拟化: 打开控制面板,点击程序或功能项&am…...
(14)Hive调优——合并小文件
目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一:insert overwrite (推荐) 3.2.2 方式二:concatenate 3.2.3 方式三ÿ…...
Linux 驱动开发基础知识——LED 模板驱动程序的改造:设备树(十一)
个人名片: 🦁作者简介:学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:Vir2021GKBS 🐼本文由…...
学习文档:QT QTreeWidget及其代理
学习文档:QT QTreeWidget及其代理 1. QT QTreeWidget简介 QT QTreeWidget是QT框架中的一个重要组件,用于显示树形数据结构。它提供了一种方便的方式来展示并操作带有层次关系的数据。QTreeWidget可以显示包含多个列的树形视图,每个项目可以…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
