django rest-framework 2.请求和响应
一、请求对象
REST 框架引入Request来扩展常规的HttpRequest,并提供了更灵活的请求解析。Request对象的核心功能是request.data属性。
导入方式: from rest_framework.response import Request
request.POST # Only handles form data. Only works for 'POST' method.
request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
二、响应对象
REST框架还引入了一个Response对象,它是一种类型的对象,它TemplateResponse采用未呈现的内容,并使用内容协商来确定正确的内容类型以返回给客户端。
return Response(data) # Renders to content type as requested by the client.
三、状态码
在Response返回中使用数字HTTP状态码并不总是有助于明显的阅读,REST框架为每一个状态码更明确的标识符,如 HTTP_404_NOT_FOUND 。
导入方式: from rest_framework import status
四、视图装饰器
REST框架提供了两个可用于编写API视图的装饰器
- @api_view # 函数装饰器
- APIView # 类装饰器
These wrappers provide a few bits of functionality such as making sure you receive Request instances in your view, and adding context to Response objects so that content negotiation can be performed.
The wrappers also provide behaviour such as returning 405 Method Not Allowed responses when appropriate, and handling any ParseError exception that occurs when accessing request.data with malformed input.
五、Pulling it all together
这里不在需要使用JSONResponse来格式化返回数据
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from test_app import serializer
from test_app import models @api_view(['GET', 'POST'])
def game_list(request):
if request.method == 'GET':
games = models.Game.objects.all()
games_serializer = serializer.Test_app_model_serializer(instance=games, many=True)
return Response(games_serializer.data)
elif request.method == 'POST':
game_serializer = serializer.Test_app_model_serializer(data=request.data)
if game_serializer.is_valid():
game_serializer.save()
return Response(game_serializer.data, status=status.HTTP_201_CREATED)
return Response(game_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
想相对于之前写的视图函数,这样更加简明扼要,这里是@api_view装饰器的功劳。
这是views.py模块中里一个视图代码
@api_view(['GET', 'PUT', 'DELETE'])
def game_info(request, game_id):
try:
game_obj = models.Game.objects.get(id=game_id)
except models.Game.DoesNotExist as e:
return Response(status=status.HTTP_404_NOT_FOUND)
# return HttpResponse(e,status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
game_serializer = serializer.Test_app_model_serializer(instance=game_obj)
return Response(game_serializer.data)
elif request.method == 'PUT':
game_serializer = serializer.Test_app_model_serializer(instance=game_obj,data=request.data)
if game_serializer.is_valid():
game_serializer.save()
return Response(game_serializer.data)
return Response(game_serializer.errors)
elif request.method == 'DELETE':
game_obj.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
六、添加可选的后缀格式
利用REST响应不再是单一的内容类型,可以为API添加对格式后缀的支持,使用格式后缀显示指定格式的返回内容
首先需要在两个视图函数添加一个关键字参数 format ,如下:
def game_list(request, format=None):
def game_info(request, game_id, format=None):
在urls.py中稍微修改文件,在现有的URL之外还附加一组 format_suffix_patterns
from django.conf.urls import url
from test_app import views
from rest_framework.urlpatterns import format_suffix_patterns urlpatterns = [
url(r'^game_list/',views.game_list),
url(r'^game_info/(\d+)/', views.game_info),
]
urlpatterns = format_suffix_patterns(urlpatterns)
我们不一定需要添加这些额外的url模式,但它给了我们一个简单,干净的方式来引用特定的格式。
七、如何使用可选的格式后缀
1. 通过 Accept 头来控制回复的格式:
http http://127.0.0.1:8000/game_list/ Accept:application/json # Request JSON
http http://127.0.0.1:8000/game_list/ Accept:text/html # Request HTML
2. 通过附加格式后缀
http http://127.0.0.1:8000/game_list.json # JSON suffix
http http://127.0.0.1:8000/game_list.api # Browsable API suffix
3. Content-Type 头控制发送的请求格式 http://www.django-rest-framework.org/tutorial/2-requests-and-responses/
# 参考官网
# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print 123" {
"id": 3,
"title": "",
"code": "print 123",
"linenos": false,
"language": "python",
"style": "friendly"
} # POST using JSON
http --json POST http://127.0.0.1:8000/snippets/ code="print 456" {
"id": 4,
"title": "",
"code": "print 456",
"linenos": false,
"language": "python",
"style": "friendly"
}
八、WEB功能
由于API根据客户端请求选择响应的内容类型,因此默认情况下,当Web浏览器请求该资源时,它将返回资源的HTML格式表示。这允许API返回完全可浏览网页的HTML表示。
拥有可浏览网页的API是一个巨大的可用性胜利,并使开发和使用您的API更容易。它也大大降低了其他开发人员检查和使用API的障碍。
有关可浏览的API功能以及如何自定义API的更多信息,请参阅可浏览的api主题。
django rest-framework 2.请求和响应的更多相关文章
- Django 学习第九天——请求与响应
一.HttpRequest 对象: 服务器接收到http协议的请求后,会根据报文创建 HttpRequest 对象视图函数的第一个参数是HttpRequest 对象再django.http 模块中定义 ...
- python的Web框架,Django框架中的请求与响应
请求与响应 简单流程图 我们先来了解一个请求与响应的大概流程 视图函数接受到的request到底是个什么对象呢? 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的 ...
- 源码剖析Django REST framework的请求生命周期
学习Django的时候知道,在Django请求的生命周期中,请求经过WSGI和中间件到达路由,不管是FBV还是CBV都会先执行View视图函数中的dispatch方法 REST framework是基 ...
- Django编写RESTful API(二):请求和响应
欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...
- Django REST FrameWork中文教程2:请求和响应
从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...
- Django底层剖析之一次请求到响应的整个流程
As we all know,所有的Web应用,其本质上其实就是一个socket服务端,而用户的浏览器就是一个socket客户端. #!/usr/bin/env python #coding:utf- ...
- django请求和响应
本文转载自https://blog.csdn.net/xiaogeldx/article/details/88096341 HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建 ...
- django 请求与响应
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- django从请求到响应的过程深入讲解
django启动 我们在启动一个django项目的时候,无论你是在命令行执行还是在pycharm直接点击运行,其实都是执行'runserver'的操作,而ruserver是使用django自带的的we ...
- Django - 请求与响应、表单、中间件、上下文处理器
请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...
随机推荐
- stringify 字符串转化成json方法
参照原文:http://www.cnblogs.com/damonlan/ http://www.jb51.net/article/29893.htm stringify的作用主要是序列化对象(转化为 ...
- PM2使用心得
PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 安装 npm install -g pm2 常用命令 $ npm i ...
- socket , 套接口还是套接字,傻傻分不清楚
socket 做网络通信的朋友大都对socket这个词不会感到陌生,但是它的中文翻译是叫套接口还是套接字呢,未必大多数朋友能够分清,今天我们就来聊聊socket的中文名称. socket一词的起源 在 ...
- LAMP 搭建
p { margin-bottom: 0.25cm; line-height: 120% } LAMP 搭建 承 Ubuntu 17.10.1安装, 定制. 参考 电子工业出版社, Ubuntu完美应 ...
- vue-cli webpack3扩展多模块打包
场景 在实际的项目开发中会出现这样的场景,项目中需要多个模块(单页或者多页应用)配合使用的情况,而vue-cli默认只提供了单入口打包,所以就想到对vue-cli进行扩展 实现 首先得知道webpac ...
- 从感知机到 SVM,再到深度学习(一)
在上篇博客中提到,如果想要拟合一些空间中的点,可以用最小二乘法,最小二乘法其实是以样例点和理论值之间的误差最小作为目标.那么换个场景,如果有两类不同的点,而我们不想要拟合这些点,而是想找到一条 ...
- io使用的设计模式
File f = new File("c:/a.txt"); 1. FileInputStream fis = new FileInputStream(f); 2. Reader ...
- Windows10+Docker搭建分布式Redis集群(SSH服务镜像)(二)
前言:上篇文章我们搭建好了Docker,下面我们开始使用Docker创建镜像,Docker命令就不介绍了.这里宿主是Windows10,cmd的管理和后期文件的复制不是很方便,将创建支持SSH的Cen ...
- codeforces 761B Dasha and friends
https://vjudge.net/problem/CodeForces-761B 题意: 有一个圆形跑道,上面有若干个障碍,分别给出两个人距离障碍的距离,问这两个人是否是在同一个跑道上跑步(我是这 ...
- qt中文乱码
刚开始学习qt,经常会遇到中文输出乱码,在网上找了解决办法有下面这个两个办法QTextCodec::setCodecForCStrings(QTextCodec::codecForName(" ...