十八、Django-restframework之请求和响应(三)

news2025/2/22 13:20:35

1. 请求对象

REST框架引入了一个扩展了常规HttpRequest的请求对象, 并提供更灵活的请求解析。请求对象的核心功能是属性request.data,这与request.POST类似,但对于WebAPIs更有用。

request.POST  # Only handles form data.  Only works for 'POST' method.
request.data  # Handles arbitrary data.  Works for 'POST', 'PUT' and 'PATCH' methods.

2. 响应对象

REST framework还引入了一个响应对象,这是一种TemplateResponse类型,它接受未渲染的内容,并使用内容协商来确定返回给客户端的正确内容类型。

return Response(data)  # Renders to content type as requested by the client.

3. 状态码

在视图中使用数字HTTP状态码并不总是容易读懂,而且当使用了错误的状态码还不容易发现。REST框架为每个状态代码提供了更显式的标识符, 比如status模块中的HTTP_400_BAD_REQUEST

4. 视图包装器

REST框架提供了两个包装器,您可以使用它们来编写API视图。

  • @api_view用来装饰基本的函数视图。
  • APIview类用来创建类视图。

这些包装器提供了一些功能,比如确保在视图中接收到请求实例,并向响应对象添加上下文,以便可以执行内容协商。

包装器还提供了一些行为,比如在适当的时候返回405 Method Not Allowed响应,以及处理当request.data输入不正确数据时发生的任何ParseError异常。

5. 一步到位

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response


@api_view(['get', 'post'])
def student_list_or_create(request):
    """
    学生列表,学生创建视图
    """
    if request.method == 'GET':
        objs = Student.objects.all()
        serializer = StudentSerializer(objs, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':

        serializer = StudentSerializer(data=request.data)
        # 3. 校验
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])
def Student_detail(request, pk):
    """
    学生详情,学生更新,学生删除
    """
    try:
        obj = Student.objects.get(pk=pk)
    except Student.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = StudentSerializer(obj)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = StudentSerializer(obj, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        obj.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

我们的实例视图是对之前示例的改进。它更简洁了一些,现在的代码感觉非常类似于我们使用表单API时的代码。我们还使用了命名状态码,这使得响应的含义更加明显。

请注意,我们不再显式地将请求或响应绑定到给定的内容类型。request.data可以处理传入的json请求,但它也可以处理其他格式。类似地,我们返回带有数据的响应对象,但允许REST框架为我们将响应呈现为正确的内容类型。

6. 为url添加可选的格式后缀

为了利用我们的响应不再硬连接到单一内容类型这一事实,让我们向API端点添加对格式后缀的支持。使用格式后缀给我们提供了明确引用给定格式的url,这意味着我们的API将能够处理像http://example.com/api/items/4.json这样的url。

首先向两个视图添加一个format关键字参数,如下所示。

def student_list(request, format=None):
def student_detail(request, pk, format=None):

现在稍微更新一下crm/urls.py文件,在现有url之外附加一组format_suffix_patterns

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from projects import views

urlpatterns = [
    path('students/', views.project_list),
    path('students/<int:pk>', views.project_detail),
]

urlpatterns = format_suffix_patterns(urlpatterns)

我们不需要添加这些额外的url模式,但它为我们提供了一种简单、干净的方法来引用特定的格式。

我们可以通过使用请求头Accept来控制返回响应的格式:

http http://127.0.0.1:8000/students/ Accept:application/json  # Request JSON
http http://127.0.0.1:8000/students/ Accept:text/html         # Request HTML

或通过添加格式后缀:

http http://127.0.0.1:8000/projects.json  # JSON suffix
http http://127.0.0.1:8000/projects.api   # Browsable API suffix

类似地,发送请求时也可处理不同的参数。

 

7. 可浏览

由于API根据客户端请求选择响应的内容类型, 默认情况下,当web浏览器请求该资源时,它将返回该资源的html格式表示。这允许API返回一个完全可网页浏览的HTML表示。

拥有一个可网页浏览的API是一个巨大的可用性胜利,使开发和使用API变得更加容易。它还极大地降低了希望检查和使用您的API的其他开发人员的进入门槛。

有关可浏览api特性和如何自定义的更多信息,请参阅可浏览api主题。

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

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

相关文章

Barra模型因子的构建及应用系列五之NonLinear Size因子

一、摘要 在前期的Barra模型系列文章中&#xff0c;我们构建了Size因子、Beta因子、Momentum因子和Residual Volatility因子&#xff0c;并分别创建了对应的单因子策略&#xff0c;本节文章在该系列下进一步构建NonLinear Size因子。从回测结果看&#xff0c;自2022年以来&…

ConcurrentHashMap-Java八股面试(五)

系列文章目录 第一章 ArrayList-Java八股面试(一) 第二章 HashMap-Java八股面试(二) 第三章 单例模式-Java八股面试(三) 第四章 线程池和Volatile关键字-Java八股面试(四) 提示&#xff1a;动态每日更新算法题&#xff0c;想要学习的可以关注一下 文章目录系列文章目录一、…

基于卷积神经网络CNN的三相故障识别

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN手写体识别 基本结构 主要参数 MATALB代码 结果图 展望 背影 现在生活&#xff0c;为节能减排&#xff0c;减少电能损…

Ajax学习 基础概念 发送请求 常见方法

AJAX 简介 AJAX 全称为Asynchronous Javascript And XML &#xff0c;就是异步的JS和XML。 通过AJAX可以再浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。…

从FPGA说起的深度学习(四)

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…

锚点定位使内容在指定区域显示

1、问题描述 在使用锚点定位时&#xff0c;使用 scrollIntoView 方法&#xff0c;导致整个页面随着锚点跳转 2、问题分析 因为最开始做需求的时候&#xff0c;只在最外层设置了一个滚动条&#xff0c;所以导致整体锚点的跳转是随着最外层滚动条距离顶部的高度跳转的&#xf…

从NLP视角看电视剧《狂飙》,会有什么发现?

文章目录1、背景2、数据获取3、文本分析与可视化3.1 短评数据预处理3.2 词云图可视化3.3 top关键词共现矩阵网络3.4 《狂飙》演职员图谱构建4、短评相关数据分析与可视化5、总结原文请关注&#xff1a;实用自然语言处理 作者&#xff1a;风兮 建议查看原文&#xff1a; https…

Linux下软件部署安装管理----rpmbuild打包rpm包部署安装

来源&#xff1a;微信公众号「编程学习基地」 文章目录1.安装rpmbuild2.rpm包制作打包rpm包3.rpm包安装4.rpm包卸载1.安装rpmbuild yum install rpmbuild yum install rpmdevtools创建rpm包管理路径&#xff0c;生成rpm相关目录 RPM打包的时候需要编译源码&#xff0c;还需要…

基于Cortex-M7内核STM32F767NIH6,STM32F767VGT6,STM32F767VIT6嵌入式技术资料

STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核&#xff0c;工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度&#xff0c;支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元&#xff08;MPU&#xff09;&#…

【完美解决】应用程序无法正常启动(0xc000007b)请单击“确定”关闭应用程序

年期安装CorelDRAW X8 (64-Bit)&#xff0c;安装完成之后运行一点毛病都没有&#xff0c;可是过了两三个月&#xff0c;再打开就出现“应用程序无法正常启动(0xc000007b)请单击“确定”关闭应用程序”这个提示框&#xff0c;如下图示 出现这个问题我就上网查找&#xff0c;无非…

Java学习笔记 --- JavaScript

一、JavaScript介绍 JavaScript语言诞生主要是完成页面的数据验证。因此它运行在客户端&#xff0c;需要运行浏览器来解析执行JavaScript代码。JS是Netcape网景公司的产品&#xff0c;最早取名为LiveScript&#xff1b;为了吸引更多java程序员。更名为 JavaScript JS是弱类型&…

File 文件操作

File 文件操作&#xff1a; 一、常用方法&#xff1a; 方法类型描述public File(String pathname&#xff09;构造给定一个要操作文件的完整路径public File(File parent, String child)构造给定要操作文件的父路径和子文件名称public boolean createNewFile() throws IOExce…

hexo部署github搭建个人博客 完整详细带图版(更新中)

文章目录0. 前置内容1. hexo创建个人博客2. GitHub创建仓库3. hexo部署到GitHub4. 常用命令newcleangenerateserverdeploy5. 添加插件5.1 主题5.2 博客基本信息5.3 创建新的菜单5.4 添加搜索功能5.5 添加阅读时间字数提示5.6 打赏功能5.7 切换主题5.8 添加不蒜子统计5.9 添加百…

小程序的拉流组件live-player的使用

前言&#xff1a; 我们在小程序中实现音视频-直播/录播 的播放时候&#xff0c;会使用到微信官方提供的两个组件&#xff0c;推流组件和拉流组件&#xff0c;这里来分享下他的拉流组件的使用和具体需要注意的点。 效果图&#xff1a; 1、拉流状态code日志 2、代码使用截图&am…

深度学习 Day26——利用Pytorch实现天气识别

深度学习 Day26——利用Pytorch实现天气识别 文章目录深度学习 Day26——利用Pytorch实现天气识别一、前言二、我的环境三、前期工作1、导入依赖项和设置GPU2、导入数据3、划分数据集四、构建CNN网络五、训练模型1、设置超参数2、编写训练函数3、编写测试函数4、正式训练六、结…

前端利用emailjs发送邮件

最近有一个需求&#xff0c;前端发送一个form表单到一个邮箱&#xff0c;找了一圈发现emailjs还不错就使用他了。首先emailjs官网注册一个账号注册完之后创建一个邮件服务&#xff08;我这里使用的是谷歌邮箱&#xff09;链接谷歌邮箱账户 然后创建服务接下来就要创建一个邮件的…

浅谈入门Servlet注解式开发

Servlet3.0版本之后&#xff0c;推出了Servlet基于注解式开发。 优点&#xff1a;开发效率高&#xff0c;直接在java类上使用注解进行标注&#xff0c;可直接省略WEB.xml文件配置import javax.servlet.annotation.WebServlet; WebServlet 使用WebServlet注解标注 WebServlet的…

五子棋的设计与实现

术&#xff1a;Java等摘要&#xff1a;五子棋是一种两人对弈的纯策略型棋类游戏&#xff0c;非常容易上手&#xff0c;老少皆宜。为了更好的推广五子棋&#xff0c;研究简单的人工智能方式&#xff0c;运用Java开发五子棋游戏。主要包含了人机对战&#xff0c;棋盘初始化&#…

中国跻身量子计算第一梯队,为何它是硬科技必争之地?丨两会唠科

科技云报道原创。 “两会唠科”是由腾讯科技推出的两会特别策划&#xff0c;重点讲述中国科技名片。本期与科技云报道联合出品&#xff0c;聚焦中国量子计算研究成果和相关进展。 全球越来越多的国家加入到量子科技领域的竞赛当中&#xff0c;争夺下一步的技术战略制高点。 今…

【论文随笔】Transfer of temporal logic formulas in reinforcement learning

Zhe Xu and Ufuk Topcu. 2019. Transfer of temporal logic formulas in reinforcement learning. In Proceedings of the 28th International Joint Conference on Artificial Intelligence (IJCAI’19). AAAI Press, 4010–4018. 这是一篇将inference和learning结合起来的文章…