曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style)。所以我们的选择变得很简单:前端ajax访问后端的RESTful web service对资源进行操作。
Django中有一些可选的REST framework,比如django-pistondjango-tasypie。 但是我和google(呵呵,不好意思)推荐这个:Django REST framework。因为这个框架的几个特点:
1. 名字好!直入主题
2. 因为名字好,所以google搜索(Django REST/ Django RESTful)排名第一
3. 当然,前面两个理由都是开玩笑的。最重要的理由是该框架对于resource,serializer,renderer/parser,
view 和
response的定义很清晰,又很符合Django的MTV模式(比如,它的view就是包装了Django的View实现的)。在Django中使用
该框架可以说是顺乎自然。
4. 对于认证和授权有很好的支持。
5. 内置了一系列的Mixin,可以随意组装。

下面用Django REST framework来实现购物车(Cart)的RESTful web service。
第一步:安装
官方文档说可以用pip或easy_install 安装,但是经过实测使用easy_install安装的不是最新版,会损失一些特性。所以建议用源代码的方式安装:
http://pypi.python.org/pypi/djangorestframework/0.3.2 下载v0.3.2,解压后$sudo python setup.py install

第二步:配置
在depot/settings.py的INSTALLED_APPS中加入:
'djangorestframework',

第三步:使用
Django REST framework有很多种“用法”,最常见的用法是:
1.
定义资源。资源将python对象(比如model对象)进行隔离、组装,生成需要序列化(serialize)的数据。除了基本的Resource类型
外,框架还提供了FormResource和ModelResource,以便于对Form或Model的处理。Resource有助于View中的处
理,当然你也可以不使用Resource,而在View中去指定要序列化的数据。
2. 创建视图。视图是对django View的封装,并定义序列化、反系列化等方法,同时通过Mixin的支持来实现get,post,put,delete等操作。框架内置了ModelView,与ModelResource配合使用非常简单方便。
3. 定义url,将正则表达式匹配的View类的as_view方法,该方法会返回django的view函数。

在我们的例子中,要处理的不是购物车本身,而是购物车中的line_item,属于model类,所以使用ModelResource和ModelView是最方便的。具体实现:
创建depotapp/resources.py

from django.core.urlresolvers import reverse
from djangorestframework.views import View
from djangorestframework.resources import ModelResource
from models import * class LineItemResource(ModelResource):
model = LineItem
fields = ('product', 'unit_price', 'quantity')
def product(self, instance):
return instance.product.title

其中重新定义关联的对象。比如LineItem关联到了Product,但我们在resource中将product属性重新定义为product.title

然后使用ModelView定义url:在depot/depotapp/urls.py的urlpatterns中增加url映射,当然首选要引入相关的模块:

depot/depotapp/urls.py

from django.conf.urls.defaults import *
from models import *
from views import *
from djangorestframework.views import ListOrCreateModelView, InstanceModelView
from resources import *
urlpatterns = patterns('',
(r'product/create/$', create_product),
(r'product/list/$', list_product ),
(r'product/edit/(?P<id>[^/]+)/$', edit_product),
(r'product/view/(?P<id>[^/]+)/$', view_product),
(r'store/$', store_view),
(r'cart/view/', view_cart),
(r'cart/clean/', clean_cart),
(r'cart/add/(?P<id>[^/]+)/$',, add_to_cart),
(r'API/cart/items', ListOrCreateModelView.as_view(resource=LineItemResource)),
)

此时访问 http://localhost:8000/depotapp/API/cart/items/ 就可以看到生成的RESTful API了:

如图所示,可以渲染(render)成json,html, xhtml,txt,xml等格式,当然你也可以增加自己的渲染,比如YAML

对于一般的情况来说,这样做就已经足够了。但是我们这里由于LineItem不是从数据库中获取的,而是从session中的cart对象中获取,所以还需要进行一些改造。
框架提供的ListOrCreateModelView继承了ModelView,同时混合了ListModelMixin和
CreateModelMixin。而ListModelMixin定义了get方法,该方法使用model.objects.all()即从数据库中获
取数据,所以我们应该修改一下View的行为,让其从session中获取数据,不妨在depotapp/views.py中自定义一个View类:

from djangorestframework.views import View
class RESTforCart(View):
def get(self, request, *args, **kwargs):
return request.session['cart'].items

然后将url改为:(r'API/cart/items', RESTforCart.as_view(resource=LineItemResource)),这时再访问 http://localhost:8000/depotapp/API/cart/items/,就可以显示购物车中的item了。默认的是 html 渲染,你可以通过http://localhost:8000/depotapp/API/cart/items/?format=json 访问json渲染:

 [{"product": "\u7a81\u7136\u5c31\u8d70\u5230\u4e86\u897f\u85cf", "unit_price": "", "quantity": }, {"product": "\u9ec4\u74dc\u7684\u9ec4 \u897f\u74dc\u7684\u897f", "unit_price": "", "quantity": }] 

用Django REST framework实现RESTful web service,可以说即简单,又灵活。

Django实战(15):Django实现RESTful web service的更多相关文章

  1. Apache CXF实战之四 构建RESTful Web Service

    Apache CXF实战之一 Hello World Web Service Apache CXF实战之二 集成Sping与Web容器 Apache CXF实战之三 传输Java对象 这篇文章介绍一下 ...

  2. <<Java RESTful Web Service实战>> 读书笔记

    <<Java RESTful Web Service实战>> 读书笔记 第一章   JAX-RS2.0入门 REST (Representational State ransf ...

  3. RESTful Web Service实战 小结1

    1 REST的基本实现形式HTTP+URI+XML,但不是唯一形式.XML后来被Json格式替代.REST是一中架构风格(Representational State Transfer,表述性状态转移 ...

  4. 【转】 Build a RESTful Web service using Jersey and Apache Tomcat 2009

    Build a RESTful Web service using Jersey and Apache Tomcat Yi Ming Huang with Dong Fei Wu, Qing GuoP ...

  5. MEAN Stack:创建RESTful web service

    本文在个人博客上的地址为URL,欢迎品尝. 前段时间做了DTREE项目中的前后端数据存储功能,在原有的ngController上进行HTTP请求,后端接受到请求后再存储到mongoDB上.现将学习所得 ...

  6. 【转】Spring 4.x实现Restful web service

    http://my.oschina.net/yuyidi/blog/352909 首先我们还是跟之前一样,创建一个maven项目,不过因为Spring Restful web service是基于Sp ...

  7. 构建一个基于 Spring 的 RESTful Web Service

    本文详细介绍了基于Spring创建一个“hello world” RESTful web service工程的步骤. 目标 构建一个service,接收如下HTTP GET请求: http://loc ...

  8. 使用Java创建RESTful Web Service(转)

    REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移).2000年Roy Fielding博士在他的博士论文“Architectural Sty ...

  9. Building a RESTful Web Service(转)

    Building a RESTful Web Service This guide walks you through the process of creating a "hello wo ...

随机推荐

  1. java selenium常用API(WebElement、iFrame、select、alert、浏览器窗口、事件、js) 一

     WebElement相关方法 1.点击操作 WebElement button = driver.findElement(By.id("login")); button.clic ...

  2. sql 2012之后分页查询速度问题

    一.SQL Server 2012使用OFFSET/FETCH NEXT分页,比SQL Server 2005/2008中的RowNumber()有显著改进.今天特地作了简单测试,现将过程分享如下: ...

  3. HTML中添加<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

    https://www.cnblogs.com/nxl0908/p/7245837.html Edge模式告诉IE以最高级 模式渲染文档,也就是任何IE版本都以当前版本所支持的最高级标准模式渲染,避免 ...

  4. 三个你不知道的CSS技巧

    各种浏览器之间的竞争的白热化意味着越来越多的人现在开始使用那些支持最新.最先进的W3C Web标准的设备,以一种更具交互性的方式来访问互联网.这意味着我们终于能够利用更强大更灵活的CSS来创造更简洁, ...

  5. elasticsearch-head插件安装说明

    下载及安装readme https://github.com/mobz/elasticsearch-head 安装: npm install npm run start 访问:http://local ...

  6. 【转】 jquery easyui datagrid使用,分页、排序、查询

    $('#dg').datagrid({ url: "xxx.ashx",                    pagination: true,                p ...

  7. 截取汉字 mb_sbstr()

    一.中文截取:mb_substr() mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断开始处,起始处为0 $l ...

  8. 配置ODBC DSN数据源,导出数据库数据到Excel过程记录

    一.前言 工作中我们可能遇到这样的需要:查询数据库中的信息,并将结果导出到Excel文件.这本来没什么,但数据量比较大时,用PLSQL.toad导出Excel会出现内存不足等情况,使用odbc+Mic ...

  9. Python基础入门(一)

    1.在线教程 2.Python下载地址,安装步骤,就是next.next... 3.配置环境变量(win8) 电脑 --> 属性 --> 高级系统设置 --> 环境变量,找到系统变量 ...

  10. 函数嵌套>作用域>闭包函数

    一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...