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 ...
随机推荐
- 服务器数据恢复_Linux网站服务器故障数据恢复案例
[数据恢复故障描述] 一台linux网站服务器,DELL R200,管理约50个左右网站,使用一块SATA 160GB硬盘.正常使用中突然宕机,尝试再次启动失败,将硬盘拆下检测时发现存在约100个坏扇 ...
- php的set_time_limit()函数
set_time_limit(0); 括号里边的数字是执行时间,如果为零说明永久执行直到程序结束,如果为大于零的数字,则不管程序是否执行完成,到了设定的秒数,程序结束. 一个简单的例子,在网页里显示1 ...
- Python-面向对象(二)-Day7
1.字段 12.方法 43.属性 63.1.属性的基本使用 73.2.实例:对于主机列表 83.3.属性的两种定义方式 94.对于类的成员而言都有两种形式: 144.1.私有成员和公有成员的访问限制不 ...
- Docker学习笔记 - Docker的容器
docker logs [-f] [-t] [--tail] 容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...
- linux centos6.8 下安装mysql 步骤
安装环境:vmware12.centos6.8.centos中配置阿里云数据元 1.下载mysql 运行: sudo yum -y install mysql-server 如果下载失败,可以卸载重新 ...
- 移动端登录页面input获取焦点后页面布局及输入框上移的问题
最近切微信页面的时候,发现移动端的登录页面,带输入框的那种,如图: 从页面本身来看没有什么问题,上传至测试服务器,用iphone访问也没有什么问题,但是当同事用Android手机获取焦点后,问题来了, ...
- python-3.x-基本数据类型
当前学习版本为: python-3.6-4 代码: """整型 NUMBER""" a = 2 ** 5 b = a + 4 c = a / ...
- 启动mongodb遇到的错:warning: 32-bit servers don't have journaling enabled by deflity
执行修复:mongod --repair即可 正常关闭:killall mongod
- MYSQL之库操作
一.系统数据库 information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 mysql:核心数据库,里面包含用户.权限. ...
- python Django之文件上传
python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...