django restframwork教程之Request和Response
从这一篇文章开始,我们会覆盖整个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_REQUEST在status模块中,使用这个来代替数字是一个不错的方法
封装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的更多相关文章
- django restframwork 教程之authentication权限
当前我们的API在编辑或者删除的时候没有任何限制,我们不希望有些人有高级的行为,确保: 代码段始终与创建者相关联 只允许授权的用户可以创建代码段 只允许代码段创建者可以更新和删除 没有认证的请求应该有 ...
- django restframework 教程之Serialization(序列化)
介绍 本教程将会通过创建一个简单的粘贴代码项目,突出显示WebAPI,过程中,会介绍组成REST框架的各种组件,让你全面了解如何配合使用. 环境设置 建议使用virtualenv建立新的虚拟环境,确保 ...
- 【转】Django中的request与response对象
关于request与response 前面几个 Sections 介绍了关于 Django 请求(Request)处理的流程分析,我们也了解到,Django 是围绕着 Request 与 Respon ...
- nodejs入门教程之http的get和request简介及应用
nodejs入门教程之http的get和request简介及应用 前言 上一篇文章,我介绍了nodejs的几个常用的模块及简单的案例,今天我们再来重点看一下nodejs的http模块,关于http模块 ...
- 【转】对Django框架架构和Request/Response处理流程的分析
本文转载于疯狂的蚂蚁. 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组成: 核心在于中间件middleware,django所有的请求.返回都由中间件来完成. ...
- 【Django】django 的request和response(转)
当请求一个页面时,Django 把请求的 metadata 数据包装成一个 HttpRequest 对象,然后 Django 加载合适的 view 方法,把这个 HttpRequest 对象作为第一个 ...
- Django REST framework 第二章 Request and Response
此章节开始真正的撰写REST framework的核心代码,介绍一系列必要的建立设计 Request Objects REST framework介绍了一个Request对象用来扩展常规的HttpRe ...
- Django中的Request和Response
接触Django这么久了,从来没有好好学习关于Django中的Request和Response对象.借着文件上传下载的相关工作,现在总结一下也不错. 当一个页面请求过来,Django会自动创建一个Re ...
- 对Django框架架构和Request/Response处理流程的分析(转)
原文:http://blog.sina.com.cn/s/blog_8a18c33d010182ts.html 一. 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组 ...
随机推荐
- Linux 网络子系统之网络协议接口层(二)
这一篇主要围绕网络协议接口层的发送函数的解析 int dev_queue_xmit(struct sk_buff *skb) 函数解析 声明: /* include/linux/netdevice.h ...
- 用STS创建Maven的Web项目<转>
右键New——>other——>Maven——>Maven Project 弹出框中点击Next,在Filter中写上:webapp. 然后在下面的框中选择org.apache.ma ...
- MyEclipse SVN 下面切换用户的解决方案
configuration\org.eclipse.core.runtime\.keyring 删除MyEclipse下面的文件. 或者修改服务器端的用户密码.
- 一站式学习Wireshark(十):应用Wireshark显示过滤器分析特定数据流(下)
介绍 掌握显示过滤器对于网络分析者来说是一项必备的技能.这是一项大海捞针的技巧.学会构建,编辑,保存关键的显示过滤器能够节省数小时的时间. 与捕捉过滤器使用的BPF语法不同,显示过滤器使用的是Wire ...
- 更改HDFS权限
hdfs dfs -chmod -R 755 / 之前执行过这条语句,但是总是提示: 15/05/21 08:10:18 WARN util.NativeCodeLoader: Unable to l ...
- thinkphp 3.2跟3.1 区别
1.ThinkPHP3.2 主要整合了3.1以及之前版本的分组问题.3.2之前有普通分组和独立分组,还需要在配置文件中配置.3.2已经不需要配置了,直接使用独立分组就可以了.2.ThinkPHP3.2 ...
- 初识Comet技术
一.服务器推送技术概述 服务器推送技术(Servers Push)的基础思想是将浏览器主动查询信息改为服务器主动发送信息.服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接.当服务器需要再 ...
- 关于lockkeyword
线程同步对象keywordlock,是以lock相应的object对象为准,即随意线程lock住lockObj对象之后,其它线程不管在其它不论什么代码段使用lock(lockObj)去进行线程同步时, ...
- 那些有关求解next数组的算法
next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strl ...
- 【Java面试题】33 HashMap和Hashtable的区别
1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值.HashMap允许null key和n ...