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 ...
随机推荐
- vue 脚手架使用
1. npm指令 vue init 模板类型 项目名称 如: vue init webpack-simple mydemo 2.进入刚才生产的 文件夹 mydemo cd mydemo 3.初始化 ...
- 数据结构编程实验——chapter10-应用经典二叉树编程
二叉树不仅结构简单.节省内存,更重要是是这种结构有利于对数据的二分处理.之前我们提过,在二叉树的基础上能够派生很多经典的数据结构,也是下面我们将进行讨论的知识点: (1) 提高数据查找效率的二叉排 ...
- 使用object_box遇到的崩溃 java.lang.UnsatisfiedLinkError:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/ ...
- maven本地库更新失败
当我们在项目中遇到有些依赖在第三方仓库特别是maven仓库里面没有的时候我们会怎么办? 答案1.通过私服,上传到公司的一个私服上然后进行下载 答案2.通过本地安装,这样非常方面进行使用,今天我们就采用 ...
- 修改elasticsearch5,搜索结果最大10000
一:在Linux服务器中执行如下命令(开启es服务) curl -XPUT http://服务器ip:9200/索引名称/_settings -d '{ "index" : { & ...
- phpcm nginx 伪静态文件
rewrite ^/show-([0-9]+)-([0-9]+)-([0-9]+).html /index.php?m=content&c=index&a=show&catid ...
- pandas空值处理与插值
# coding:utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.int ...
- java后台中处理图片辅助类汇总(上传图片到服务器,从服务器下载图片保存到本地,缩放图片,copy图片,往图片添加水印图片或者文字,生成二维码,删除图片等)
最近工作中处理小程序宝箱活动,需要java画海报,所以把这块都快百度遍了,记录一下处理的方法,百度博客上面也有不少坑! 获取本地图片路径: String bgPath = Thread.current ...
- 如何更方便的查看Linux内核代码的更新记录【转】
转自:http://blog.csdn.net/lee244868149/article/details/44302819 Linux内核的更新非常的快,如何快速的了解这些更新呢?最一般的办法就是把新 ...
- JUnit基本介绍
一.什么是单元测试 单元测试(Unit Testing)是指在计算机编程中,针对程序模块来进行正确性检验的测试工作.单元测试的特点如下: ※ 程序单元是应用最小的可测试部件,通常采用基于类或者类的方 ...