Django restful Framework 之Requests and Response 方法
前言:
本章主要介绍REST framework 内置的必要的功能。
Request objects
Response objects
Status codes
Wrapping API views
结合以上方法定义字节的view
如何给在url中定义特定格式及动态路由
1.Request objects
REST framework 引入了一个新的对象Request,其对Django 的HttpRequest 模块功能进行了扩展,提供了更为灵活的request 解析功能,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 framework 引入了一个新的对象Response,这是一种处理响应的模板可以对内容进行判断并决定返回给客户端正确的内容类型。
return Response(data) # Renders to content type as requested by the client.
REST framework 引入了status 功能,里边内置了针对各种状态的对应处理模块,比如说HTTP_400_BAD_REQUEST,总之对状态处理更方便了。
4.封装API views
REST framewor 提供两种封装API views 的方法
a. @api_view 针对以函数定义的views进行封装
b. APIView 针对以类定义的views进行封装
这些封装方法提供了一些功能确保你的view中接收了Request实例,并将获取的内容交给response处理,当然也包含权限验证和提交的数据是否符合要求,会返回405 Method Not Allowed
熟悉了以上新特性后,我们来看看如何应用以上方法
有了Response方法后,就不用在使用之前的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)
利用以上方式定义views,看起来跟舒服了,有木有,并且我们使用了status方法,这样对不同的响应做了更精确的处理
下面是对每个具体的snippet进行定义,代码如下:
@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)
如果我们的url中出现类似snippets.json ,我们可以通过给views对应的函数添加format参数,实现此功能,示例如下:
def snippet_list(request, format=None): ##
def snippet_detail(request, pk, format=None):
现在我们调整下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)
下面来看看请求的时候有何变化,结果如下:
localhost:cmdb JasonWang$ http http://127.0.0.1:8000/rest_api/snippets/
^[[3~HTTP/1.0 200 OK
Allow: OPTIONS, GET, POST
Content-Type: application/json
Date: Fri, 11 Nov 2016 09:55:44 GMT
Server: WSGIServer/0.2 CPython/3.5.0
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN [
{
"code": "foo = \"Jason\"\n",
"id": 1,
"language": "python",
"linenos": false,
"style": "friendly",
"title": ""
},
{
"code": "print \"Hello,Jason\"\n",
"id": 2,
"language": "python",
"linenos": false,
"style": "friendly",
"title": ""
},
{
"code": "print \"Hello,Jason\"",
"id": 3,
"language": "python",
"linenos": false,
"style": "friendly",
"title": ""
}
]
localhost:cmdb JasonWang$ http http://127.0.0.1:8000/rest_api/snippets/ Accept:application/json
HTTP/1.0 200 OK
Allow: OPTIONS, GET, POST
Content-Type: application/json
Date: Fri, 11 Nov 2016 09:56:40 GMT
Server: WSGIServer/0.2 CPython/3.5.0
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN [
{
"code": "foo = \"Jason\"\n",
"id": 1,
"language": "python",
"linenos": false,
"style": "friendly",
"title": ""
},
{
"code": "print \"Hello,Jason\"\n",
"id": 2,
"language": "python",
"linenos": false,
"style": "friendly",
"title": ""
},
{
"code": "print \"Hello,Jason\"",
"id": 3,
"language": "python",
"linenos": false,
"style": "friendly",
"title": ""
}
] l
json header请求
localhost:cmdb JasonWang$ http http://127.0.0.1:8000/rest_api/snippets/ Accept:text/html
HTTP/1.0 200 OK
Allow: OPTIONS, GET, POST
Content-Type: text/html; charset=utf-8
Date: Fri, 11 Nov 2016 09:57:15 GMT
Server: WSGIServer/0.2 CPython/3.5.0
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN <!DOCTYPE html>
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="robots" content="NONE,NOARCHIVE" /> <title>Snippet List – Django REST framework</title> <link rel="stylesheet" type="text/css" href="/static/rest_framework/css/bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="/static/rest_framework/css/bootstrap-tweaks.css"/> <link rel="stylesheet" type="text/css" href="/static/rest_framework/css/prettify.css"/>
<link rel="stylesheet" type="text/css" href="/static/rest_framework/css/default.css"/> </head> <body class=""> <div class="wrapper"> <div class="navbar navbar-static-top navbar-inverse">
<div class="container">
<span> <a class='navbar-brand' rel="nofollow" href='http://www.django-rest-framework.org'>
Django REST framework
</a> </span>
<ul class="nav navbar-nav pull-right"> <li><a href='/api/api-auth/login/?next=/rest_api/snippets/'>Log in</a></li> </ul>
</div>
</div> <div class="container"> <ul class="breadcrumb"> <li class="active"><a href="/rest_api/snippets/">Snippet List</a></li> </ul> <!-- Content -->
<div id="content"> <form id="get-form" class="pull-right">
<fieldset> <div class="btn-group format-selection">
<a class="btn btn-primary js-tooltip" href="/rest_api/snippets/" rel="nofollow" title="Make a GET request on the Snippet List resource">GET</a> <button class="btn btn-primary dropdown-toggle js-tooltip" data-toggle="dropdown" title="Specify a format for the GET request">
<span class="caret"></span>
</button>
<ul class="dropdown-menu"> <li>
<a class="js-tooltip format-option" href="/rest_api/snippets/?format=json" rel="nofollow" title="Make a GET request on the Snippet List resource with the format set to `json`">json</a>
</li> <li>
<a class="js-tooltip format-option" href="/rest_api/snippets/?format=api" rel="nofollow" title="Make a GET request on the Snippet List resource with the format set to `api`">api</a>
</li> </ul>
</div> </fieldset>
</form> <form class="button-form" action="/rest_api/snippets/" data-method="OPTIONS">
<button class="btn btn-primary js-tooltip" title="Make an OPTIONS request on the Snippet List resource">OPTIONS</button>
</form> <div class="content-main">
<div class="page-header">
<h1>Snippet List</h1>
</div>
<div style="float:left"> <p>List all snippets, or create a new snippet.</p> </div> <div class="request-info" style="clear: both" >
<pre class="prettyprint"><b>GET</b> /rest_api/snippets/</pre>
</div> <div class="response-info">
<pre class="prettyprint"><span class="meta nocode"><b>HTTP 200 OK</b>
<b>Allow:</b> <span class="lit">OPTIONS, GET, POST</span>
<b>Content-Type:</b> <span class="lit">application/json</span>
<b>Vary:</b> <span class="lit">Accept</span> </span>[
{
"id": 1,
"title": "",
"code": "foo = \"Jason\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
},
{
"id": 2,
"title": "",
"code": "print \"Hello,Jason\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
},
{
"id": 3,
"title": "",
"code": "print \"Hello,Jason\"",
"linenos": false,
"language": "python",
"style": "friendly"
}
]</pre>
</div>
</div> <div > <div class="well tab-content"> <div id="post-generic-content-form"> <form action="/rest_api/snippets/" method="POST" class="form-horizontal">
<fieldset> <div class="form-group">
<label for="id__content_type" class="col-sm-2 control-label">Media type:</label>
<div class="col-sm-10">
<select data-override="content-type" id="id__content_type" name="_content_type" required class="form-control">
<option value="application/json" selected="selected">application/json</option>
<option value="application/x-www-form-urlencoded">application/x-www-form-urlencoded</option>
<option value="multipart/form-data">multipart/form-data</option>
</select>
<span class="help-block"></span>
</div>
</div> <div class="form-group">
<label for="id__content" class="col-sm-2 control-label">Content:</label>
<div class="col-sm-10">
<textarea cols="40" data-override="content" id="id__content" name="_content" rows="10" required class="form-control">
</textarea>
<span class="help-block"></span>
</div>
</div> <div class="form-actions">
<button class="btn btn-primary" title="Make a POST request on the Snippet List resource">POST</button>
</div>
</fieldset>
</form> </div>
</div>
</div> </div><!-- /.content -->
</div><!-- /.container -->
</div><!-- ./wrapper --> <script>
window.drf = {
csrfHeaderName: "X-CSRFTOKEN",
csrfCookieName: "csrftoken"
};
</script>
<script src="/static/rest_framework/js/jquery-1.12.4.min.js"></script>
<script src="/static/rest_framework/js/ajax-form.js"></script>
<script src="/static/rest_framework/js/csrf.js"></script>
<script src="/static/rest_framework/js/bootstrap.min.js"></script>
<script src="/static/rest_framework/js/prettify-min.js"></script>
<script src="/static/rest_framework/js/default.js"></script>
<script>
$(document).ready(function() {
$('form').ajaxForm();
});
</script> </body> </html>
html header 请求
发送Post请求,更新数据,方法如下:
localhost:cmdb JasonWang$ http --form POST http://127.0.0.1:8000/rest_api/snippets/ code="print 123"
HTTP/1.0 201 Created
Allow: OPTIONS, GET, POST
Content-Type: application/json
Date: Fri, 11 Nov 2016 09:59:46 GMT
Server: WSGIServer/0.2 CPython/3.5.0
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN {
"code": "print 123",
"id": 4,
"language": "python",
"linenos": false,
"style": "friendly",
"title": ""
} localhost:cmdb JasonWang$
Django restful Framework 之Requests and Response 方法的更多相关文章
- django restful framework 一对多方向更新数据库
目录 django restful framework 序列化 一 . 数据模型: models 二. 序列化: serializers 三, 视图: views 四, 路由: urls 五. 测试 ...
- 在django restful framework中设置django model的property
众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...
- 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍
4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍 天涯明月笙 关注 2018.02.20 19:23* 字数 762 阅读 135 ...
- 3- vue django restful framework 打造生鲜超市 - model设计和资源导入
3- vue django restful framework 打造生鲜超市 - model设计和资源导入 使用Python3.6与Django2.0.2(Django-rest-framework) ...
- 7- vue django restful framework 打造生鲜超市 -商品类别数据展示(上)
Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页 并没有将列表页的数据json 与前端的页面展示结合起来 讲解如果将dr ...
- django restful framework教程大全
一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...
- 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)
Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页下 drf中的request和response drf对于django的 ...
- Django REST Framework学习——Android使用REST方法访问Diango
本文更应该叫做Android如何模拟浏览器访问Django服务器后台. 环境为: Android通过HttpClient访问服务器,从Django中获取json数据,解析显示在UI界面上. 问题为: ...
- 1- vue django restful framework 打造生鲜超市
Vue+Django REST framework实战 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支 ...
随机推荐
- hdu 1358:Period(KMP算法,next[]数组的使用)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 理解javascript函数调用和“this”
http://blog.csdn.net/littlechang/article/details/8180550
- 经验总结20--C#模拟WEB请求
非常多语言能够使用代码进行WEB请求,获取到须要的数据. 方便调用别人的接口,自己进行处理. HttpWebRequest request = WebRequest.Create(url) as Ht ...
- Leetcode: Construct Binary Tree from Preorder and Inorder Traversal, Construct Binary Tree from Inorder and Postorder Traversal
总结: 1. 第 36 行代码, 最好是按照 len 来遍历, 而不是下标 代码: 前序中序 #include <iostream> #include <vector> usi ...
- iOS开发之--苹果个人开发者账号如何升级成公司账号
1.拨打苹果针对中国区开发者的咨询服务热线:4006 701 855 2.简单向对方(中文不太标准,但听懂没问题)说明意图后,会要求提供: (1)之前申请IDP时purchase form上的pers ...
- Cognos组织架构介绍
Cognos只是一个工具,说到Cognos相信大部分人都知道BI(商业智能,Business Intelligence). Cognos也是属于SOA架构,面向服务的体系结构,是一个组件模型,它将应用 ...
- JAVA需要掌握的一些技术
1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该了解UML,尤其是class,object,interaction以及statediagrams ...
- Packet for query is too large (1166 > 1024). You can change this value
转载: MySQL max_allowed_packet 设置过小导致记录写入失败 mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_pack ...
- JS实现关闭当前子窗口,刷新父窗口及调用父窗口的方法
一.js实现关闭当前子窗口,刷新父窗口 JS代码如下: <script> function refreshParent() { window.opener.location.href = ...
- Educational Codeforces Round 25 E. Minimal Labels&&hdu1258
这两道题都需要用到拓扑排序,所以先介绍一下什么叫做拓扑排序. 这里说一下我是怎么理解的,拓扑排序实在DAG中进行的,根据图中的有向边的方向决定大小关系,具体可以下面的题目中理解其含义 Educatio ...