从这一点开始,我们将真正开始覆盖REST框架的核心。我们来介绍几个基本的构建块。

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

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.

  

状态码
在您的视图中使用数字HTTP状态代码并不总是用于明显的阅读,如果错误代码错误,很容易就不会注意到。REST框架为每一个状态码更明确的标识符,如HTTP_400_BAD_REQUEST所述的status模块。相对于使用数字标识符更好。

包装API视图
REST框架提供了两个可用于编写API视图的包装器。

@api_view用于使用基于功能的视图的装饰器。

该APIView班与基于类的视图工作。

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

包装器还提供405 Method Not Allowed适当的返回响应等行为,以及处理使用格式不正确的输入ParseError访问时发生的任何异常request.data。

把它拉在一起
好的,让我们开始使用这些新的组件来写几个视图。

我们不再需要我们的JSONResponse课views.py,所以继续删除。一旦完成,我们可以稍微开始重构我们的观点。

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer @api_view(['GET', 'POST'])
def snippet_list(request):
"""
显示snippets所有数据,后者创建一个新的snippet
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data) elif request.method == 'POST':
serializer = SnippetSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

  

我们的实例视图比以前的例子有所改进。这有点简明扼要,现在的代码与我们使用Forms API非常相似。我们还使用命名状态代码,这使得响应意义更加明显。

以下是views.py模块中单个代码段的视图。

@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
snippet的查、更新、删除
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return Response(serializer.data) elif request.method == 'PUT':
serializer = SnippetSerializer(snippet, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE':
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

  

这应该都是非常熟悉的 - 它与使用常规Django视图没有什么不同。

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

向我们的网址添加可选的格式后缀
为了充分利用我们的响应不再单一的内容类型,我们可以为API端点添加对格式后缀的支持。使用格式后缀给我们明确指定给定格式的URL,这意味着我们的API将能够处理诸如http://example.com/api/items/...之类的 URL 。

首先format在两个视图中添加一个关键字参数,就像这样。

def snippet_list(request, format=None):

  

def snippet_detail(request, pk, format=None):

  

现在urls.py稍稍更新文件,format_suffix_patterns除了现有的URL之外还附加一组。

from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views urlpatterns = [
url(r'^snippets/$', views.snippet_list),
url(r'^snippets/(?P<pk>[0-9]+)$', views.snippet_detail),
] urlpatterns = format_suffix_patterns(urlpatterns)

  

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

怎么看?
从命令行开始测试API,就像我们在第1部分中所做的那样。一切工作都非常相似,尽管如果发送无效请求,我们有更好的错误处理。

我们可以像以前一样获取所有片段的列表。

http http://127.0.0.1:8000/snippets/

HTTP/1.1 200 OK
...
[
{
"id": 1,
"title": "",
"code": "foo = \"bar\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
},
{
"id": 2,
"title": "",
"code": "print \"hello, world\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
}
]

  

我们可以通过使用Accept头来控制回复的格式:

http http://127.0.0.1:8000/snippets/ Accept:application/json  # Request JSON

http http://127.0.0.1:8000/snippets/ Accept:text/html         # Request HTML

  

或通过附加格式后缀:

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

  

类似地,我们可以使用Content-Type头来控制我们发送的请求的格式。

# 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"
}

  

如果您--debug向上述http请求添加切换器,则可以在请求标头中查看请求类型。

现在,在Web浏览器中打开API,访问http://127.0.0.1:8000/snippets/

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

拥有可浏览网页的API是一个巨大的可用性胜利,并使开发和使用您的API更容易。它也大大降低了其他开发人员要检查和使用API的障碍。

有关可浏览的API功能以及如何自定义API的更多信息,请参阅可浏览的api主题。

下一步是什么?
在第3部分的教程中,我们将开始使用基于类的视图,并查看通用视图如何减少需要编写的代码量。

Django REST FrameWork中文文档目录:

Django REST FrameWork 中文教程1:序列化

Django REST FrameWork 中文教程2:请求和响应

Django REST FrameWork 中文教程3:基于类的视图

Django REST FrameWork 中文教程4:验证和权限

Django REST FrameWork 中文教程5:关系和超链接API

Django REST FrameWork 中文教程6: ViewSets&Routers

Django REST FrameWork 中文教程7:模式和客户端库

Django REST FrameWork中文教程2:请求和响应的更多相关文章

  1. Django REST framework 中文教程1:序列化

    建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...

  2. Django REST FrameWork中文教程3:基于类的视图

    我们也可以使用基于类的视图编写我们的API视图,而不是基于函数的视图.我们将看到这是一个强大的模式,允许我们重用常用功能,并帮助我们保持代码DRY. 使用基于类的视图重写我们的API 我们将首先将根视 ...

  3. Python3+PyCharm+Django+Django REST framework开发教程

    一.说明 自己一是想跟上潮流二是习惯于直接干三是没有人可以请教,由于这三点经常搞得要死要活.之前只简单看过没写过Diango,没看过Django REST framework,今天一步到位直接上又撞上 ...

  4. Django框架的使用教程--路由-请求-响应[四]

    路由 路由可以定义在工程的目录下(看你的需求),也可以定义在各个应用中来保存应用的路由,用主路文件urls中使用include()包含各个应用的子路由的数据 路由的解析顺序 Django接收到请求后, ...

  5. StarlingMVC Framework中文教程

    配置与开始 将Starling项目配置为StarlingMVC项目,仅需几行代码.在继承于starling.display.Sprite的起始类里,创建一个StarlingMVC的实例,并传递给它三个 ...

  6. Django 博客开发教程目录索引

    Django 博客开发教程目录索引 本项目适合 0 基础的 Django 开发新人. 项目演示地址:Black & White,代码 GitHub 仓库地址:zmrenwu/django-bl ...

  7. Django Rest Framework 教程及API向导

    Django Rest Framework 教程及API向导. 一.请求(Request)REST_FRAMEWORK 中的 Request 扩展了标准的HttpRequest,为 REST_FRAM ...

  8. django restful framework教程大全

    一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...

  9. Django REST Framework 教程开篇

    作者:HelloGitHub-追梦人物 欢迎来到 HelloDjango 全栈系列教程第二步--Django REST Framework 教程! 首先恭喜你完成了 HelloDjango 全栈系列教 ...

随机推荐

  1. 201521123060 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1 ...

  2. 201521123113 《Java程序设计》第3周学习总结

    1. 本周学习总结 2.书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  3. 201521123050 《Java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 1.1立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) ...

  4. 201521123116 《java程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jm ...

  5. 201521123016《Java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) - ...

  6. PHP连接数据_insert_id介绍

    对于自增长的主键列不好取值的情况,php提供了一个变量来取值,insert_id $db = new MySQLi("localhost","root",&qu ...

  7. 关于Linux的loop设备

    偶然发现/dev目录里有几个loop设备,一番搜索得知,这是一种伪设备(pseudo-device),它可以把一个文件连接为设备(就像Windows下用虚拟光驱挂载ISO文件). 遂做实验验证: 1. ...

  8. HTML超文本

    1.HTML链接 2.HTML表格 3.HTML图像 4.HTML列表 5.HTML块 6.HTML布局 7.HTML表单 1.HTML链接 (1)给文字及图片添加超链接 < html> ...

  9. jquery自定义banner图滚动插件---(解决最后一张图片倒回第一张图片的bug)

    banner图的滚动效果动画 最近做项目中banner滚动的时候遇到了一个小bug,当banner滚动到最后一张图再跳回第一张图时, 会出现默认的倒回第一张图的过渡效果,看了几个插件都是这样,所以自定 ...

  10. 线段树+RMQ问题第二弹

    线段树+RMQ问题第二弹 上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的 ...