当前位置: 首页 > news >正文

REST framework中Views API学习

REST framework提供了一个APIView类,它是Django的View类的子类。

APIView类和一般的View类有以下不同:

  • 被传入到处理方法的请求不会是Django的HttpRequest类的实例,而是REST framework的Request类的实例。
  • 处理方法可以返回REST framework的Response,而不是Django的HttpRequest。视图会管理内容协议,给响应设置正确的渲染器。
  • 任何异常情况都将被捕获并调解为适当的响应。APIException
  • 在将请求分派给处理程序方法之前,将对传入的请求进行身份验证,并运行适当的权限和/或限制检查。
    使用APIView类和使用一般的View类非常相似,通常,进入的请求会被分发到合适处理方法比如.get(),或者.post。
    此外,可以在类上设置许多属性,这些属性控制 API 策略的各个方面。
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import Userclass ListUser(APIView):authentication_classes = [authentication.TokenAuthentication]permission_classes = [permissions.IsAdminUser]def get(self, request, format=None):"""Return a list of all users."""usernames = [user.username for user in User.objects.all()]return Response(usernames)

基于函数的视图:

REST框架还允许您使用基于常规函数的视图。它提供了一组简单的装饰器,这些装饰器包装了基于函数的视图,以确保它们接收到(而不是通常的 Django )的实例,并允许它们返回(而不是 Django ),并允许您配置如何处理请求。

@api_view()

signature: @api_view(http_method_names=[‘GET’])
demo:

from rest_framework.decorators import api_view
from rest_framework.response import Response@api_view
def hello_word(request):return Response({"message":"Hello World"})

这个视图会使用settings中指定的默认的渲染器,解析器,认证类等等。
默认只接受get请求,其它会得到一个405 Method Not Allowed 的响应

@api_view(['GET','POST'])
def hello_word(request):if request.method == 'POST':return Response({"message": "Got some data!", "data": request.data})return Response({"message":"Hello World"})

API 策略装饰器

为了覆盖默认设置,REST框架提供了一组额外的装饰器,可以将其添加到视图中。这些必须位于装饰器之后(下方)。
例如,要创建一个使用限制的视图,以确保特定用户每天只能调用一次,请使用装饰器,并传递限制类的列表:

@api_view
@throttle_classes
from rest_framework.decorators import api_view,throttle_classes
from rest_framework.throttling import UserRateThrottleclass OncePerDay(UserRateThrottle):rate = '1/day'@api_view()
@throttle_classes([OncePerDay])
def hello_word(request):return Response({"message":"Hello World"})

这些装饰器对应于上述在子类上设置的属性。APIView
可用的装饰器包括:

  • @renderer_classes(…)
  • @parser_classes(…)
  • @authentication_classes(…)
  • @throttle_classes(…)
  • @permission_classes(…)

以下是一些常见的 API policy attributes 及其功能和使用方式:
1.permission_classes:用于定义访问视图的权限类。

from rest_framework.permissions 
import IsAuthenticatedclass MyView(APIView):permission_classes = [IsAuthenticated]

功能:限制只有经过身份验证的用户才能访问该视图。

2.authentication_classes:指定用于认证用户的认证类。

from rest_framework.authentication 
import SessionAuthentication, BasicAuthenticationclass MyView(APIView):authentication_classes = [SessionAuthentication, BasicAuthentication]

功能:确定如何验证用户的身份。

3.throttle_classes:用于设置访问频率限制的类。

from rest_framework.throttling 
import UserRateThrottleclass MyView(APIView):throttle_classes = [UserRateThrottle]

功能:控制对 API 的请求速率,防止滥用。

4.renderer_classes

  • 功能:指定用于将响应数据渲染为特定格式(如 JSON、XML 等)的渲染器类。
  • 使用方式:
from rest_framework.renderers 
import JSONRenderer
class MyView(APIView):renderer_classes = [JSONRenderer]

5.parser_classes:

  • 功能:定义用于解析传入请求数据的解析器类。
  • 使用方式:
from rest_framework.parsers 
import JSONParserclass MyView(APIView):parser_classes = [JSONParser]

6.content_negotiation_class:

  • 功能:负责根据客户端的请求头来确定使用哪种渲染器和解析器。
  • 使用方式:
from rest_framework.negotiation 
import DefaultContentNegotiationclass MyView(APIView):content_negotiation_class = DefaultContentNegotiation

通过合理设置这些属性,可以更好地控制 API 处理请求和响应的数据格式,以满足不同客户端的需求。

API policy instantiation methods

以下是一些常见的 API policy instantiation methods 及其功能和使用方式:
1.get_permissions(self)

  • 功能:获取应用于视图的权限实例列表。
  • 使用方式:在视图类中重写该方法以自定义权限的获取逻辑。
    2.get_authentication(self)
  • 功能:获取用于视图的认证实例列表。
  • 使用方式:重写该方法来指定特定的认证方式。
    3.get_throttles(self)
  • 功能:获取应用于视图的节流(访问频率限制)实例列表。
  • 使用方式:通过重写自定义节流策略。

例如:

from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.throttling import UserRateThrottleclass MyView(APIView):def get_permissions(self):return [IsAuthenticated()]def get_throttles(self):return [UserRateThrottle()]

API 策略实现方法:
在调度到处理程序方法之前,将调用以下方法:

  • .check_permissions
  • check_throttles
  • perform_content_negotiation

架构装饰器[View schema decorator]

主要解决的问题:
1.文档生成:它可以帮助自动生成 API 的文档,让开发者和使用者更清晰地了解 API 的输入和输出格式、参数要求等。
2.接口约定和规范:明确规定 API 的结构和数据格式,有助于保证接口的一致性和可维护性。
3.客户端开发辅助:为客户端开发者提供准确的接口描述,方便他们进行开发和集成。
4.数据验证和转换:在某些情况下,可以辅助进行输入数据的验证和转换,确保传入的数据符合预期。

from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchemaclass CustomAutoSchema(AutoSchema):def get_link(self, path, method, base_url):# override view introspection here...@api_view(['GET'])
@schema(CustomAutoSchema())
def view(request):return Response({"message": "Hello for today! See you tomorrow!"})

相关文章:

REST framework中Views API学习

REST framework提供了一个APIView类,它是Django的View类的子类。 APIView类和一般的View类有以下不同: 被传入到处理方法的请求不会是Django的HttpRequest类的实例,而是REST framework的Request类的实例。处理方法可以返回REST framework的…...

Vue(四)——总结

渐进式JavaScript框架 Vue.js是一套构建用户界面(UI)的渐进式JavaScript框架。 1、库和框架的区别? 库:库是提供给开发者的一个封装好的特定于某一方面的集合(方法和函数),库没有控制权&…...

计算机毕业设计 招生宣传管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

练习题PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行

突破长度限制 使用usort上传后门 usort — 使用用户自定义的比较函数对数组中的值进行排序 paramusort(...$GET); ...为php设置可变长参数 在url地址栏中输入[]test&1[]phpinfo();&2assert 包含了phpiinfo()命令执行 结合usort使用 assert…...

EPLAN关于PLC的输入输出模块绘制

EPLAN关于PLC的输入输出模块绘制 总览图上的PLC绘制原理图上的PLC绘制编辑IO注释显示总览界面IO注释自动关联总览IO地址 总览图上的PLC绘制 右键项目【新建】 页类型选择【总览】,描述可以自由编辑,之后确认即可。 由于我们需要绘制PLC的输入输出&#x…...

【Linux】sersync 实时同步

原理 rsync 是不支持实时同步的,通常我们借助于 inotify 这个软件来实时监控文件变化,一旦inotify 监控到文件变化,则立即调用 rsync 进行同步,推送到 rsync 服务端。 环境准备 步骤1:获取数据包 获取 sersync 的包…...

Unity 资源分享 之 恐龙Ceratosaurus资源模型携 82 个动画来袭

Unity 资源分享 之 恐龙Ceratosaurus资源模型携 82 个动画来袭 一、前言二,资源包内容三、免费获取资源包 一、前言 亲爱的 Unity 开发者和爱好者们,大家好!今天要为大家分享一份超级酷炫的 Unity 资源——恐龙资源模型,而且它还…...

【AI绘画】 学习内容简介

AI绘画-学习内容简介 1. 效果展示 本次测试主要结果展示如下: 卡通手办定制1 卡通手办定制2 艺术写真定制 2. 主要目录 AI 绘画- 文生图,图生图及lora使用(基于diffusers) AI 绘画- 模型转换与快速生图(基于diffus…...

树形结构查找(B树、B+树)

平衡树结构的树高为 O(logn) ,平衡树结构包括两种平衡二叉树结构(分别为 AVL 树和 RBT)以及一种树结构(B-Tree,又称 B 树,它的度大于 2 )。AVL 树和 RBT 适合内部存储的应用,而 B 树…...

网络通信(TCP/UDP协议 三次握手四次挥手 )

三、TCP协议与UDP协议 1、TCP/IP、TCP、 UDP是什么 TCP/IP协议是一个协议簇,里面包括很多协议的, UDP只是其中的一个, 之所以命名为TCP/IP协议, 因为TCP、 IP协议是两个很重要的协议,就用他两命名了,而TCP…...

C# ADO.Net 通用按月建表插入数据

原理是获取原表表结构以及索引动态拼接建表SQL&#xff0c;如果月表存在则不创建&#xff0c;不存在则创建表结构 代码如下 /// <summary>/// 根据指定的表名和时间按月进行建表插入&#xff08;如果不存在对应的月表&#xff09;/// </summary>/// <param nam…...

19-ESP32-C3加大固件储存区

1默认编译情况。 2、改flash4M。ESP-IDF Partition Table Editor修改。 3、设置输入Partition Table 改自定义.CSV。保存。 4、查看命令输入Partition Table Editor打开-分区表编辑器UI。按图片增加。 nvs,data,nvs,0x9000,0x6000,, phy_init,data,phy,0xF000,0x1000,, factory…...

【STL】stack/queue 容器适配器 deque

1.stack的介绍和使用 1.1.stack的介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容…...

(回溯) LeetCode 17. 电话号码的组合

原题链接 一. 题目描述 17. 电话号码的字母组合 已解答 中等 相关标签 相关企业 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对…...

Ghidra:开源软件逆向工程框架

Ghidra 是一个软件逆向工程 (SRE) 框架 Ghidra 是一种尖端的开源软件逆向工程 (SRE) 框架&#xff0c;是美国国家安全局 (NSA) 研究局的产品。 Ghidra 该框架具有高端软件分析工具&#xff0c;使用户能够分析跨各种平台&#xff08;包括 Windows、macOS 和 Linux&#xff09…...

Spring AI 更新:支持OpenAI的结构化输出,增强对JSON响应的支持

就在昨晚&#xff0c;Spring AI发了个比较重要的更新。由于最近OpenAI推出了结构化输出的功能&#xff0c;可确保 AI 生成的响应严格遵守预定义的 JSON 模式。此功能显着提高了人工智能生成内容在现实应用中的可靠性和可用性。Spring AI 紧随其后&#xff0c;现在也可以对OpenA…...

java.util.ConcurrentModificationException 并发修改异常

目录 异常代码片段 详细说明 解决方案 使用迭代器进行遍历 使用临时集合存储结果 异常代码片段 if (ObjectUtil.isNotEmpty(candidateUsers)) {candidateUsers candidateUsers.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList());for (String …...

Flask数据库操作(第四阶段)

目录 Flask数据库操作一、数据库基础1.1 关系型数据库与非关系型数据库选择数据库 二、Flask-SQLAlchemy2.1 安装 Flask-SQLAlchemy2.2 创建数据库模型2.2.1 创建 Flask 应用2.2.2 定义模型 2.3 执行 CRUD 操作2.3.1 创建&#xff08;Create&#xff09;2.3.2 读取&#xff08;…...

C语言问答进阶--5、基本表达式和基本语句

赋值表达式 表达式是什么&#xff1f;表达式是由运算符和操作数组成的式子。 如下的代码 #include "iostream.h" int main() { int a1,b2,sum; cout<<(sumab)<<endl; return 0; } 那么如下的呢&#xff1f; #include "iostream.h" int mai…...

uniapp3.0实现图片上传公用组件上传uni-file-picker,uni.uploadFile

用uniapp3.0的写法组合式api&#xff0c;setup形式封装一个图片上传公用组件&#xff0c;要求 1、使用uni-file-picker选择文件 2、uni.uploadFile上传图片 3、要能支持上传接口动态化 4、支持删除如片列表中已上传项 5、可以预览已上传列表图片 6、支持动态化限制图片格…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...