从这一篇文章开始,我们会覆盖整个REST framwork框架的核心,接下来让我们介绍一些基础的构建块

Request 对象

REST framework 引入了一个扩展HttpRequest的请求对象,提供了更灵活的请求解析,Request对象的核心功能是request.data属性,它类似于request.POST,但是对于Web APIs更实用

request.POST  # 仅可处理表单数据,仅仅用于post请求.
request.data # 处理任意数据, 可供 'POST', 'PUT' and 'PATCH' 请求使用.

Response对象

REST framework 也引入了一个response对象,它是一种TemplateResponse类型,它渲染文本内容,并根据内容决定返回给客户端的数据类型

return Response(data)  # 通过客户端请求返回渲染的内容

Status Code 状态码

在你的视图中使用数字http 状态码不利于阅读,它很容易让你不会注意到代码的错误,REST framework为每个状态码提供了更加明确的标示,例如HTTP_400_BAD_REQUESTstatus模块中,使用这个来代替数字是一个不错的方法

封装API视图

REST framework提供了两种封装器,你可以使用他们写views

  • @api_view 装饰器用在函数的view中
  • @APIView 装饰器用在类的view中

这两个装饰器提供了一些功能。例如确保在你的view中收到request请求和在response对象中添加context从而能够根据内容协商渲染

装饰器还提供了一些行为,如适当的返回405 Method Not Allowed不允许请求的响应,以及当访问request.data发生格式错误时处理任何ParseError异常

开始组装使用

接上一篇的代码,现在我们的view视图中不再需要JSONResponse 类,所以先删除它,然后开始重构我们的视图

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):
"""
List all snippets, or create a new 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) @api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
Retrieve, update or delete a snippet instance.
"""
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框架渲染响应成正确的内容类型。

在我们的UIRLs中添加可选的格式后缀

为了突出我们的response不再是单一的格式内容的事实,让我们在API URL尾部添加格式后缀,用格式后缀给我们明确参考指定格式的URL,类似于http://example.com/api/items/4.json.

增加format关键字参数在views中

def snippet_list(request,format=None)

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

接着更新我们的urls.py文件,添加一个format_suffix_patterns的参数

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

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

看看效果

我们要开始从命令行测试API。虽然我们能在发送无效的请求时更妥当处理错误,但是现在一切都做的够好了。 我们能想之前一样获取所有的snippets列表

默认返回json格式
curl -s http://127.0.0.1:8000/snippets/ | jq .
[
{
"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"
},
{
"id": 3,
"title": "",
"code": "print \"hello, world\"",
"linenos": false,
"language": "python",
"style": "friendly"
}
]

指定格式访问

  • 在请求头中指定格式
curl -s http://127.0.0.1:8000/snippets/  -H "Accept:application/json"  # Request JSON
curl -s http://127.0.0.1:8000/snippets/ -H "Accept:text/html" # Request HTML
  • 在url中指定格式
curl -s http://127.0.0.1:8000/snippets.json    # Request JSON
curl -s http://127.0.0.1:8000/snippets.api # Request HTML

django restframwork教程之Request和Response的更多相关文章

  1. django restframwork 教程之authentication权限

    当前我们的API在编辑或者删除的时候没有任何限制,我们不希望有些人有高级的行为,确保: 代码段始终与创建者相关联 只允许授权的用户可以创建代码段 只允许代码段创建者可以更新和删除 没有认证的请求应该有 ...

  2. django restframework 教程之Serialization(序列化)

    介绍 本教程将会通过创建一个简单的粘贴代码项目,突出显示WebAPI,过程中,会介绍组成REST框架的各种组件,让你全面了解如何配合使用. 环境设置 建议使用virtualenv建立新的虚拟环境,确保 ...

  3. 【转】Django中的request与response对象

    关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...

  4. nodejs入门教程之http的get和request简介及应用

    nodejs入门教程之http的get和request简介及应用 前言 上一篇文章,我介绍了nodejs的几个常用的模块及简单的案例,今天我们再来重点看一下nodejs的http模块,关于http模块 ...

  5. 【转】对Django框架架构和Request/Response处理流程的分析

    本文转载于疯狂的蚂蚁. 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组成: 核心在于中间件middleware,django所有的请求.返回都由中间件来完成. ...

  6. 【Django】django 的request和response(转)

    当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个 ...

  7. Django REST framework 第二章 Request and Response

    此章节开始真正的撰写REST framework的核心代码,介绍一系列必要的建立设计 Request Objects REST framework介绍了一个Request对象用来扩展常规的HttpRe ...

  8. Django中的Request和Response

    接触Django这么久了,从来没有好好学习关于Django中的Request和Response对象.借着文件上传下载的相关工作,现在总结一下也不错. 当一个页面请求过来,Django会自动创建一个Re ...

  9. 对Django框架架构和Request/Response处理流程的分析(转)

    原文:http://blog.sina.com.cn/s/blog_8a18c33d010182ts.html 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组 ...

随机推荐

  1. Android Wear Preview- 归档通知(Stacking Notifications)

    ---------------------------------------------------------------------------------------------------- ...

  2. SSM 整合

    --- 分为三层: DAO层:负责与数据源进行交互 Service:业务处理层,也可称为服务层,对上层提供统一接口的服务. Controller: 控制器层,负责处理来自客户端的请求. 通用配置: d ...

  3. ubuntu rails3.2.16 提示gem mysql adapter

    把database.yml的adapter改为mysql2 把Gemfile文件中的gem mysql改为gem mysql2

  4. PHP注释的艺术——phpDoc规范

    用过IDE或看过其他源码的小伙伴们应该都见过类似下面这样的注释   /** * 递归获取所有游戏分类 * @param int $id * @return array */ 看得多了就大概知道了一些规 ...

  5. 给原型扩展一下tirm方法

    方便以后,直记录下来 <script type="text/javascript"> //给原型护展tirm方法 String.prototype.trim=funct ...

  6. C/C++预处理指令

    预处理指令 Preprocessor Directives define undef ifdef ifndef if endif else and elif line error include 预定 ...

  7. OPenGL 库文件的添加

    OPenGL使用前必须添加一些必要的库文件: 需要安装 GLUT 工具包: GLUT下载地址   GLAUX下载地址 Windows 环境下安装 GLUT 的步骤:1.将下载的压缩包解开,将得到 5 ...

  8. LINUX下CPU Load Average的一点研究

    背景: 公司的某个系统工作在基于Linux的Cent OS下,一个host下同时连接了许多client, 最近某台Host总是显示CPU Load Average过高,我们单纯的以为是CPU的占用过高 ...

  9. HTC Desire 816刷机教程(图文)

    HTC Desire 816刷机教程也来了,今天在这里主要是来说说如何刷机的,这个刷机是采用卡刷的方式,也就是利用第三方的recovery来刷入第三方的zip包,因为第三方的zip包都是支持卡刷的,很 ...

  10. Ubuntu13.04下Eclipse中文乱码解决

    参考:http://www.linuxidc.com/Linux/2011-12/50056.htm baoyu@baoyu:~$ gedit /var/lib/locales/supported.d ...