前言:

本章主要介绍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.

2.Response objects

REST framework 引入了一个新的对象Response,这是一种处理响应的模板可以对内容进行判断并决定返回给客户端正确的内容类型。

return Response(data)  # Renders to content type as requested by the client.

3.Status codes

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>[
{
&quot;id&quot;: 1,
&quot;title&quot;: &quot;&quot;,
&quot;code&quot;: &quot;foo = \&quot;Jason\&quot;\n&quot;,
&quot;linenos&quot;: false,
&quot;language&quot;: &quot;python&quot;,
&quot;style&quot;: &quot;friendly&quot;
},
{
&quot;id&quot;: 2,
&quot;title&quot;: &quot;&quot;,
&quot;code&quot;: &quot;print \&quot;Hello,Jason\&quot;\n&quot;,
&quot;linenos&quot;: false,
&quot;language&quot;: &quot;python&quot;,
&quot;style&quot;: &quot;friendly&quot;
},
{
&quot;id&quot;: 3,
&quot;title&quot;: &quot;&quot;,
&quot;code&quot;: &quot;print \&quot;Hello,Jason\&quot;&quot;,
&quot;linenos&quot;: false,
&quot;language&quot;: &quot;python&quot;,
&quot;style&quot;: &quot;friendly&quot;
}
]</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 方法的更多相关文章

  1. django restful framework 一对多方向更新数据库

    目录 django restful framework 序列化 一 . 数据模型: models 二. 序列化: serializers 三, 视图: views 四, 路由: urls 五. 测试 ...

  2. 在django restful framework中设置django model的property

    众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...

  3. 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍

    4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍 天涯明月笙 关注 2018.02.20 19:23* 字数 762 阅读 135 ...

  4. 3- vue django restful framework 打造生鲜超市 - model设计和资源导入

    3- vue django restful framework 打造生鲜超市 - model设计和资源导入 使用Python3.6与Django2.0.2(Django-rest-framework) ...

  5. 7- vue django restful framework 打造生鲜超市 -商品类别数据展示(上)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页 并没有将列表页的数据json 与前端的页面展示结合起来 讲解如果将dr ...

  6. django restful framework教程大全

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

  7. 6- vue django restful framework 打造生鲜超市 -完成商品列表页(下)

    Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 商品列表页下 drf中的request和response drf对于django的 ...

  8. Django REST Framework学习——Android使用REST方法访问Diango

    本文更应该叫做Android如何模拟浏览器访问Django服务器后台. 环境为: Android通过HttpClient访问服务器,从Django中获取json数据,解析显示在UI界面上. 问题为: ...

  9. 1- vue django restful framework 打造生鲜超市

    Vue+Django REST framework实战 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支 ...

随机推荐

  1. Red Hat系统安装Redis

    环境 RHLinux-6.4-64-EN, 红帽6.4 64位,英文正式公布版 安装 安装非常easy,先下载redis的压缩包,下载地址见这里.然后复制到你的linux机器.接着运行以下的命令. 1 ...

  2. hdu 1813(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1813 思路:首先bfs预处理出‘0’到边界点最短距离,然后构造 h() 为所’0‘点逃离迷宫的最少步数 ...

  3. hdu 3760(2次bfs求最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3760 思路:首先是建反图,从点n开始做spfa求出n到各点的最短路,然后从1点开始搜最小序列,对于边( ...

  4. js实现jquery的offset()

    用过jQuery的offset()的同学都知道 offset().top或offset().left很方便地取得元素相对于整个页面的偏移. 而在js里,没有这样直接的方法,节点的属性offsetTop ...

  5. Fel初认识

    Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开放的,引擎执行中的多个模块都可以扩展或替换.Fel的执行主要是通过函数实现,运算符(+.-等都是Fel函数),所有这 ...

  6. 88、android 插件开发教程(转载)

    http://blog.csdn.net/qq435757399/article/details/46521085 http://blog.csdn.net/t12x3456/article/deta ...

  7. 【POJ2516】Minimum Cost

    [POJ2516]Minimum Cost 题意:有N个收购商.M个供应商.K种物品.对于每种物品,每个供应商的供应量和每个收购商的需求量已知.每个供应商与每个收购商之间运送该物品的运费已知.求满足收 ...

  8. JDBC通用DAO

    dbcBaseDao接口,内容如下: package com.sun4j.core.jdbc.dao; import java.io.Serializable; import java.util.Li ...

  9. Vue基础-渲染函数-插槽

    Vue 测试版本:Vue.js v2.5.13 先看个插槽的例子: <div id="app"> <child > <span slot-scope= ...

  10. 160509、Java过滤器与SpringMVC拦截器之间的关系与区别

    今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深 ...