DRF 常用功能

文章目录

  • 一、主流认证方式
    • Session认证
    • Token认证
    • JWT认证
  • 二、DRF认证与权限
    • Session认证
      • 所有视图(全局)启用认证
      • 视图级别启用认证
    • Token认证[`推荐`]
      • 安装APP
      • 启用Token认证
      • 生成数据库表(因为token要存储到数据库)
      • 配置Token认证接口URL
      • 获取token
      • 使用token去访问API接口
      • 重写ObtainAuthToken
        • 创建myapp/obtain_auth_token.py
        • 修改myapp/urls.py
  • 三、限流
  • 四、过滤
    • 安装django-filter模块
    • 添加APP
    • 添加DRF配置
    • 在视图中指定过滤的字段
  • 五、搜索和排序
  • 六、分页
    • 重写PageNumberPagination类
  • 七、自动生成接口文档
    • 安装django-rest-swagger模块
    • 添加APP:
    • DRF配置
    • 配置libraries
    • 配置URL路由:
    • 效果
  • 参考


一、主流认证方式

Session认证

在这里插入图片描述

Token认证

Cookie+Session通常在浏览器作为客户端的情况下比较通用,随着前后端分离开发模式的普及,会涉及到多端(PC、APP、Pad),特别是手机端,支持Cookie不友好,并且Cookie不支持跨域,因此基于这些局限性,Token逐渐主流。
在这里插入图片描述

JWT认证

与普通Token一样,都是访问资源的令牌,区别是普通Token服务端验证token信息要查询数据库验证,JWT验证token信息不用查询数据库,只需要在服务端使用密钥效验。
在这里插入图片描述

二、DRF认证与权限

DRF支持四种认证方式:

• BasicAuthentication:基于用户名和密码的认证,适用于测试
• SessionAuthentication:基于Session的认证
• TokenAuthentication:基于Token的认证
• RemoteUserAuthentication:基于远程用户的认证

DRF支持权限:

• IsAuthenticated:只有登录用户才能访问所有API
• AllowAny:允许所有用户
• IsAdminUser:仅管理员用户
• IsAuthenticatedOrReadOnly:登录的用户可以读写API,未登录用户只读

Session认证

由于Django默认提供Session存储机制,可直接通过登录内置管理后台进行验证。
当登录管理后台后,就有权限访问了

所有视图(全局)启用认证

在settings.py下面添加如下内容:

# DRF配置
REST_FRAMEWORK = {# 认证方式'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.SessionAuthentication',],# 设置权限'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',]
}

视图级别启用认证

在这里插入图片描述

Token认证[推荐]

安装APP

打开settings.py,添加rest_framework.authtoken
在这里插入图片描述

启用Token认证

# DRF配置
REST_FRAMEWORK = {# 认证方式'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication',],# 设置权限'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated',]
}

生成数据库表(因为token要存储到数据库)

python manage.py migrate

配置Token认证接口URL

在myapp/urls.py下面添加

from rest_framework.authtoken import views
urlpatterns += [re_path('^api-token-auth/', views.obtain_auth_token)
]

获取token

打开APIPost
在这里插入图片描述
URL地址:http://127.0.0.1:8000/myapp/api-token-auth/
用户名密码:

{"username": "admin","password": "admin"
}

在这里插入图片描述
会得到一个token:cd2c67838cd59a321a4e5000ad7ab00632386229
在这里插入图片描述

使用token去访问API接口

URL:http://127.0.0.1:8000/myapp/api/project/
在这里插入图片描述
可正常返回结果
在这里插入图片描述

重写ObtainAuthToken

默认的obtain_auth_token视图返回的数据比较简单,只有token一项,如果想返回更多的信息,例如用户名,可以通过重写ObtainAuthToken类的方法来实现

创建myapp/obtain_auth_token.py
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Responseclass CustomAuthToken(ObtainAuthToken):def post(self, request, *args, **kwargs):serializer = self.serializer_class(data=request.data)serializer.is_valid(raise_exception=True)user = serializer.validated_data['user']token, created = Token.objects.get_or_create(user=user)return Response({'token': token.key,'username': user.username})
修改myapp/urls.py
from myapp.obtain_auth_token import CustomAuthToken
urlpatterns += [re_path('^api-token-auth/', CustomAuthToken.as_view())
]

三、限流

可以对接口访问的频率进行限制,以减轻服务器压力。
应用场景:投票、购买数量等

在settings.py的REST_FRAMEWORK下面添加如下内容:

# 限流:范围'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.AnonRateThrottle',   # 未登录用户'rest_framework.throttling.UserRateThrottle'    # 已登录用户),
# 限流:访问频率'DEFAULT_THROTTLE_RATES': {# 周期:second,minute,hour,day'anon': '3/minute', # 针对未登录用户进行限制,每分钟最多访问3分钟,基于IP区分用户'user': '5/minute', # 针对登录用户进行限制,每分钟最多访问5次,基于用户ID区分}

四、过滤

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。
文档:https://www.django-rest-framework.org/api-guide/filtering/

安装django-filter模块

pip install django-filter

添加APP

INSTALLED_APPS = [...'django_filters'
]

添加DRF配置

REST_FRAMEWORK = {# 过滤'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

在视图中指定过滤的字段

在这里插入图片描述

五、搜索和排序

DRF提供过滤器帮助我们快速对字段进行搜索和排序。
在这里插入图片描述

六、分页

分页是数据表格必备的功能,可以在前端实现,也可以在后端实现,为了避免响应数据过大,造成前端压力,一般在后端实现。

REST_FRAMEWORK = {# 分页'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 3 # 每页数目
}

重写PageNumberPagination类

默认分页器灵活度不高,例如不能动态传递每页条数,可以通过重写PageNumberPagination类属性改变默认配置。

创建myapp/pagination.py

from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Responseclass MyPagination(PageNumberPagination):page_size = 10  # 默认每页显示多少条数据page_query_param = 'page_num'   # 指定URL查询第几页的关键字名称,默认为"page"page_size_query_param = 'page_size' # 指定URL查询(每页显示多少条数据)关键字名称,默认为Nonemax_page_size = 50  # 每页最多显示多少条数据# 重写分页响应数据def get_paginated_response(self, data):self.code = 200msg = '成功'if not data:code = 404msg = '没有发现数据'return Response({'code': code,'msg': msg,'count': self.page.paginator.count,'data': data})

DRF配置指定模块路径

REST_FRAMEWORK = {…………'DEFAULT_PAGINATION_CLASS': 'myapp.pagination.MyPagination',
}

在这里插入图片描述

七、自动生成接口文档

文档参考:https://django-rest-swagger.readthedocs.io/en/latest/

安装django-rest-swagger模块

pip install django-rest-swagger

添加APP:

INSTALLED_APPS = [...'rest_framework_swagger',
]

DRF配置

REST_FRAMEWORK = {# API接口文档'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

配置libraries

在setting.py中添加如下内容:

'libraries': {  # Adding this section should work around the issue.'staticfiles': 'django.templatetags.static',
},

在这里插入图片描述

配置URL路由:

myapp/urls.py

from rest_framework_swagger.views import get_swagger_view
schema_view = get_swagger_view(title='接口文档')
urlpatterns += [re_path('^docs/$', schema_view),
]

效果

在这里插入图片描述

参考

https://www.aliangedu.cn/course/learn?cid=20&sid=10&pid=2197

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

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

相关文章

迭代器模式【行为模式C++】

1.简介 迭代器模式是一种行为设计模式, 让你能在不暴露集合(聚合对象)底层表现形式 (列表、 栈和树等) 的情况下遍历集合(聚合对象)中所有的元素。 迭代器的意义就是将这个行为抽离封装起来&a…

STM32F4 IAP跳转APP问题及STM32基于Ymodem协议IAP升级笔记

STM32F4 IAP 跳转 APP问题 ST官网IAP例程Chapter1 STM32F4 IAP 跳转 APP问题1. 概念2. 程序2.1 Bootloader 程序 问题现象2.2. APP程序 3. 代码4. 其他问题 Chapter2 STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxxChapter3 STM32基于Y…

SQLite数据库在Linux系统上的使用

SQLite是一个轻量级的数据库解决方案,它是一个嵌入式的数据库管理系统。SQLite的特点是无需独立的服务器进程,可以直接嵌入到使用它的应用程序中。由于其配置简单、支持跨平台、服务器零管理,以及不需要复杂的设置和操作,SQLite非…

python如何输入多行

Python中的Input()函数在输入时,遇到回车符,那么一次输入就结束了。这不能满足输入多行文本并且行数也不确定的情形,当然输入空行也是允许的。 方法1:利用异常处理机制实现 lines[] while True:try:lines.append(input())except:…

达梦数据库清理归档日志的方法

达梦数据库清理归档日志的方法 在达梦数据库(DM数据库)中,归档日志文件是数据库运行过程中产生的,用于记录所有对数据库修改的详细信息。这些日志对于数据库的恢复非常关键,尤其是在进行灾难恢复或数据恢复时。然而&a…

关于Linux下的进程等待(进程篇)

目录 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 怎样去执行进程等待&#xff1f; status options 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 代码示例&#xff1a;模仿僵尸进程 #include <stdio.h> #include <unistd.…

xss跨站脚本攻击笔记

1 XSS跨站脚本攻击 1.1 xss跨站脚本攻击介绍 跨站脚本攻击英文全称为(Cross site Script)缩写为CSS&#xff0c;但是为了和层叠样式表(CascadingStyle Sheet)CSS区分开来&#xff0c;所以在安全领域跨站脚本攻击叫做XSS 1.2 xss跨战脚本攻击分类 第一种类型:反射型XSS 反射…

java数据结构与算法刷题-----LeetCode684. 冗余连接

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 并查集 并查集 解题思路&#xff1a;时间复杂度O( n ∗ l o g 2…

ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC

ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC 文章目录 ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC动态调试环境配置Thinkphp反序列化链5.1.X原理分析一.实现任意文件删除二.实现任意命令执行真正的难点 Thinkphp反序列化链5.1.…

JVM规范中的运行时数据区

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

SpringBoot 集成H2数据库,启动执行sql, 中文乱码

目录 H2数据库介绍 SpringBoot版本&#xff1a;SpringBoot 2.1.12.RELEASE 快速集成H2&#xff0c;maven依赖 快速集成H2&#xff0c;数据源及关键参数配置 spring.datasource.schema参数&#xff08;建表SQL脚本&#xff09; spring.datasource.data参数&#xff08;更新、…

Qt5 编译 Qt Creator 源码中的 linguist 模块

文章目录 下载 Qt Creator 源码手动翻译多语言自动翻译多语言 下载 Qt Creator 源码 Github: https://github.com/qt/qttools 笔记打算用 Qt 5.12.12 来编译 qt creator-linguist 所以笔者下载的是 tag - 5.12.12 &#xff0c;解压后如下&#xff0c;先删除多余的文件&#xf…

【Vue】Vue3中的OptionsAPI与CompositionAPI

文章目录 OptionsAPICompositionAPI对比总结 OptionsAPI 中文名:选项式API通过定义methods,computed,watch,data等属性方法&#xff0c;处理页面逻辑。以下是OptionsAPI代码结构 实例代码: <script lang"ts">// js或者tsimport { defineComponent } from vu…

【学习】软件测试需求分析要从哪些方面入手

软件测试需求分析是软件测试过程中非常重要的一个环节&#xff0c;它是为了明确软件测试的目标、范围、资源和时间等要素&#xff0c;以确保软件测试的有效性和全面性。本文将从以下几个方面对软件测试需求分析进行详细的阐述&#xff1a; 一、软件测试目标 软件测试目标是指…

读所罗门的密码笔记16_直通心智

1. 直通心智 1.1. 如今&#xff0c;科学家已经可以诱发触觉、压觉、痛觉和大约250种其他感觉 1.1.1. DARPA支持的触觉技术第一次让一位受伤的人能够用假肢和手指感知到被触碰的物体 1.1.2. 可以建立人工系统&#xff0c;来替换和弥补受损大脑的部分区域 1.1.3. 神经科学家能…

Nginx日志格式化和追踪

背景 Nginx是一款功能强大的Web服务器&#xff0c;对于网络环境中的日志记录和配置至关重要。定制化Nginx日志格式可以帮助管理员更好地监控服务器性能、分析用户行为并做出相应优化。在本文中&#xff0c;我们将深入探讨Nginx日志格式的高级定制化策略&#xff0c;包括理解基…

词频统计程序

使用Hadoop MapReduce处理文本文件&#xff0c;Mapper负责将文本分割为单词&#xff0c;然后Reducer对每个单词进行计数&#xff0c;最后将结果写入输出文件。 // 定义WordCount公共类 public class WordCount {// 主入口方法&#xff0c;处理命令行参数public static void m…

循环神经网络RNN

循环神经网络RNN是一种人工神经网络&#xff0c;旨在处理时间序列、语音和自然语言等序列数据。将RNN 想象成传送带&#xff0c;一次处理一个元素的信息&#xff0c;从而 "记住 "前一个元素的信息&#xff0c;对下一个元素做出预测。   想象一下&#xff0c;我们有…

【多线程】Thread的常见属性 | 终止线程 | 等待线程 | 休眠线程 | 线程安全

文章目录 一、Thread的方法Thread的常见属性后台线程&#xff08;守护线程&#xff09;设置后台线程是否存活 启动线程终止\打断一个线程1.创建标志位2.调用 interrupt() 方法 等待一个线程 join()t.join&#xff08;&#xff09;的工作过程&#xff1a; 休眠一个进程sleep 二、…

ppt从零基础到高手【办公】

第一章&#xff1a;文字排版篇01演示文稿内容基密02文字操作规范03文字排版处理04复习&作业解析第二章&#xff1a;图形图片图表篇05图形化表达06图片艺术化07轻松玩转图表08高效工具&母版统一管理09复习&作业解析10轻松一刻-文字图形小技巧速学第三章&#xff1a;…