Django实战(15):Django实现RESTful web service
曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style)。所以我们的选择变得很简单:前端ajax访问后端的RESTful web service对资源进行操作。
Django中有一些可选的REST framework,比如django-piston,django-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的更多相关文章
- Apache CXF实战之四 构建RESTful Web Service
Apache CXF实战之一 Hello World Web Service Apache CXF实战之二 集成Sping与Web容器 Apache CXF实战之三 传输Java对象 这篇文章介绍一下 ...
- <<Java RESTful Web Service实战>> 读书笔记
<<Java RESTful Web Service实战>> 读书笔记 第一章 JAX-RS2.0入门 REST (Representational State ransf ...
- RESTful Web Service实战 小结1
1 REST的基本实现形式HTTP+URI+XML,但不是唯一形式.XML后来被Json格式替代.REST是一中架构风格(Representational State Transfer,表述性状态转移 ...
- 【转】 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 ...
- MEAN Stack:创建RESTful web service
本文在个人博客上的地址为URL,欢迎品尝. 前段时间做了DTREE项目中的前后端数据存储功能,在原有的ngController上进行HTTP请求,后端接受到请求后再存储到mongoDB上.现将学习所得 ...
- 【转】Spring 4.x实现Restful web service
http://my.oschina.net/yuyidi/blog/352909 首先我们还是跟之前一样,创建一个maven项目,不过因为Spring Restful web service是基于Sp ...
- 构建一个基于 Spring 的 RESTful Web Service
本文详细介绍了基于Spring创建一个“hello world” RESTful web service工程的步骤. 目标 构建一个service,接收如下HTTP GET请求: http://loc ...
- 使用Java创建RESTful Web Service(转)
REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移).2000年Roy Fielding博士在他的博士论文“Architectural Sty ...
- Building a RESTful Web Service(转)
Building a RESTful Web Service This guide walks you through the process of creating a "hello wo ...
随机推荐
- radioButton drawable selector
1.实现radioButton drawable selector更改图片,在drawable文件夹下,新建selector文件, <selector xmlns:android="h ...
- dp px 互转工具类
public class DensityUtils { public static int dpToPx(Context context,int dp){ float density = contex ...
- List(JDK1.7)(1)
java.util包. 与Set不同, List允许重复的元素.即 e1.equals(e2). 部分方法定义 int size(); 返回列表中元素的个数,如果超过Integer.MAX_VALUE ...
- soj1049.Mondriaan
1049. Mondriaan Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Squares and rectangl ...
- Bzoj4763 雪辉
Time Limit: 39 Sec Memory Limit: 666 MBSubmit: 151 Solved: 80 Description 上次立下的NOIP退役Flag没有成功 这次 ...
- [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约 ...
- HDU 1256 画8 模拟题
解题报告:这题我觉得题目有一个没有交代清楚的地方就是关于横线的字符的宽度的问题,题目并没有说,事实上题目要求的是在保证下面的圈高度不小于上面的圈的高度的情况下,横线的宽度就是等于下面的圈的高度. #i ...
- 【Linux 命令】sed 命令
文章转载自:https://www.jianshu.com/p/779f40985b20 文本分隔:------ # 在每一行后面增加一空行. sed G # 在每一行后面增加两行空行. sed &q ...
- HDU 1242 Rescue (广搜)
题目链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The priso ...
- numpy_array与PIL.Image之间的互转
# conding:utf-8 import matplotlib.pyplot as plt import numpy as np import PIL.Image as image # 图片的读取 ...