Django REST/ Django RESTful
来源:互联网 发布:三国杀风火山林淘宝 编辑:程序博客网 时间:2024/05/30 23:00
原文地址:http://blog.csdn.net/thinkinside/article/details/7236807,欢迎转载,请保留链接!
曾几何时,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
from django.core.urlresolvers import reversefrom djangorestframework.views import Viewfrom djangorestframework.resources import ModelResourcefrom 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)),
- )
from django.conf.urls.defaults import *from models import *from views import *from djangorestframework.views import ListOrCreateModelView, InstanceModelViewfrom 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
from djangorestframework.views import Viewclass 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": "12", "quantity": 2}, {"product": "\u9ec4\u74dc\u7684\u9ec4 \u897f\u74dc\u7684\u897f", "unit_price": "12", "quantity": 38}]
[{"product": "\u7a81\u7136\u5c31\u8d70\u5230\u4e86\u897f\u85cf", "unit_price": "12", "quantity": 2}, {"product": "\u9ec4\u74dc\u7684\u9ec4 \u897f\u74dc\u7684\u897f", "unit_price": "12", "quantity": 38}]
用Django REST framework实现RESTful web service,可以说即简单,又灵活。
- Django REST/ Django RESTful
- 利用 Django REST framework 编写 RESTful API
- Django Rest Framework 3.3.2 开发 RESTful API
- Django RESTful 使用tastypie
- Django-Restful框架
- django restful api
- Django REST框架实现
- Django REST framework
- Django REST framework API
- Django REST framework
- Django-Rest-Framework 教程
- django rest framework Serializer
- Django Rest Framework
- django rest framework quickstart
- Jersey VS Django-Rest
- Django REST 异常处理
- Django REST实现步骤
- Django rest framework
- 所有在类的声明中定义的函数将被自动认为是内联函数。
- SOAP和HTTP 两种基本传输协议
- linux内核栈与用户栈
- 二叉树
- mysql内存原理与数据结构介绍
- Django REST/ Django RESTful
- jquery控制css绝对定位位置效果,例如鼠标移动到图标显示层显示相关信息
- Apache commons (Java常用工具包)简介
- 回溯法简介
- C++ 读取组策略中的密码策略
- 回溯法:输出n的全排列,解哈密顿问题,马的遍历问题,解八后问题
- sizeof详解
- N9 安装Qt5
- Ubuntu下Jenkins 安装