Django實現RESTful web service

原文地址:http://blog.csdn.net/thinkinside/article/details/7236807,歡迎轉載,請保留鏈接!

曾幾何時,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

  1. from django.core.urlresolvers import reverse  
  2. from djangorestframework.views import View  
  3. from djangorestframework.resources import ModelResource  
  4. from models import *  
  5.   
  6. class LineItemResource(ModelResource):  
  7.     model = LineItem  
  8.     fields = ('product''unit_price''quantity')  
  9.     def product(self, instance):  
  10.         return instance.product.title  
其中重新定義關聯的對象。比如LineItem關聯到了Product,但我們在resource中將product屬性重新定義爲product.title


然後使用ModelView定義url:在depot/depotapp/urls.py的urlpatterns中增加url映射,當然首選要引入相關的模塊:

depot/depotapp/urls.py

  1. from django.conf.urls.defaults import *  
  2. from models import *  
  3. from views import *  
  4. from djangorestframework.views import ListOrCreateModelView, InstanceModelView  
  5. from resources import *  
  6. urlpatterns = patterns('',  
  7.     (r'product/create/$', create_product),  
  8.     (r'product/list/$', list_product ),  
  9.     (r'product/edit/(?P<id>[^/]+)/$', edit_product),  
  10.     (r'product/view/(?P<id>[^/]+)/$', view_product),  
  11.     (r'store/$', store_view),  
  12.     (r'cart/view/', view_cart),  
  13.     (r'cart/clean/', clean_cart),  
  14.     (r'cart/add/(?P<id>[^/]+)/$',, add_to_cart),  
  15.     (r'API/cart/items', ListOrCreateModelView.as_view(resource=LineItemResource)),  
  16. )  
此時訪問 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類:

  1. from djangorestframework.views import View  
  2.   
  3. class RESTforCart(View):  
  4.     def get(self, request, *args, **kwargs):  
  5.         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渲染:
[javascript] view plaincopy
  1. [{"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,可以說即簡單,又靈活。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章