Django 利用 API 實現 AJAX 操做

Django的缺點之一,就是它不支持AJAX。好吧,我知道這麼一說又會有一羣人反駁:Django有各類模塊能夠提供AJAX功能;寫一個XML的view來實現AJAX;整合pyjams就什麼功能都有了云云。嘛,均可以,我這也只是分享一個可行的方案,並非惟一的。若是這個方案正好適合你的項目,那直接拿去用不是更省時間嗎?javascript

首先說一下如今項目的狀況,前端工程師想用AJAX的方式(依賴於jQuery),經過POST/GET/PUT請求,提交JSON/XML/YAML格式的數據給後臺數據庫暴露出的一個API地址,以實現對後臺數據的操做。若是在view裏寫一個函數來作比較麻煩,因此使用tastypie直接根據定義的model生成一個API。html

Install&Begin

須要安裝django-tastpiepython-digestpython-dateutilmimeparse。最近由於某些緣由國外的https訪問常常會受到影響,因此附上下載連接。固然能用pip/easy_install之類的命令來安裝最好,已經給出了模塊名,這裏再也不重複寫一次命令了。前端

仍是和之前同樣,先以最快的方式先把tastypie跑起來:java

建立名爲products應用爲例,須要編輯products/models.py,新建products/api.py,而後編輯項目的urls.py:
products/models.py範例用,超簡單,沒什麼可說的。python

from django.db import models
class Product(models.Model):
    name = models.CharField(max_length=16)
    brand = models.CharField(max_length=32)
    def __unicode__(self):
        return self.titlejquery

products/api.pygit

from tastypie.resources import ModelResource
from accounts.models import Product
class ProductResource(ModelResource):
    class Meta:
        queryset = Product.objects.all()
        resource_name = 'p' #可選,不設置的話默認爲productgithub

urls.py,引入在api中定義的ProductResourceajax

from django.conf.urls.defaults import patterns, include, url
from accounts.api import ProductResource
urlpatterns = patterns('',
    url(r'^api/', include(ProductResource().urls)),
)mongodb

api定義完成,訪問http://127.0.0.1:8000/api/p/?format=json能夠看到JSON格式的數據,如右圖。由於我裝了JSONView for chrome,因此輸出的JSON格式比默認的友好一些。

models.py和urls.py都是基礎配置,因此主要說一下api.py。這裏使用了ModelResource而不是Django提供的Resource,這樣就脫離了Django的ORM,提供了擴展到NOSQL的可能性。網上有一個名爲tastymongo的項目,做者的目的彷佛是想實現tastypie和mongodb的整合,可是一直沒有更新,因此咱們項目中是直接利用mongoengine將這二者整合在一塊兒。

POST & INSERT

以POST請求發送一個JSON數據給/api/p/這個地址實現數據的添加,在views.py中創建一個簡單的函數,載入product/add.htm模板。html代碼以下:

<html>
  <head>
    <title>Tastyapi</title>
  </head>
  <body>
    <form>
      <input type="text" id="brand" />
      <input type="text" id="name" />
      <input type="button" onclick="ajax_insert()" value="insert" />
    </form>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" ></script>
  <script type="text/javascript" >

  function ajax_insert()
  {
    var pname = $('#name').val();
    var pbrand = $('#brand').val();
    $.ajax({
      type : "POST", //要插入數據,因此是POST協議
      url : "/api/p/", //注意結尾的斜線,不然會出現500錯誤
      data : '{"name" : "'+pname+'", "brand" : "'+pbrand+'"}', //JSON數據
      success: function(){
        alert('Submit Success')
      },
      dataType : 'json', //在ie瀏覽器下我沒有加dataTpye結果報錯,因此建議加上
      contentType : 'application/json',
    });
  }
  </script>
  </body>
</html> 

這個時候若是進行操做,會返回401錯誤,由於尚未進行用戶驗證。畢竟api涉及對後臺數據的操做,若是不驗證提交者的身份,對於網站安全來講不是什麼好事。要實現驗證惟一須要修改的是api.py文件:

from tastypie.resources import ModelResource
from accounts.models import Product
from tastypie.authentication import BasicAuthentication
from tastypie.authorization import DjangoAuthorization
class ProductResource(ModelResource):
    class Meta:
        queryset = Product.objects.all()
        resource_name = 'p'
        authorization = DjangoAuthorization()
        #authorization = Authorization()
        #authentication = BasicAuthentication()

設置只有只有登陸的用戶能經過API操做數據。L10的Authorization()驗證方式是容許任何人使用這個API,L11的BasicAuthentication()是使用 HTTP的驗證方式,就是咱們常看到的,彈出一個難看的文本框,而後然你輸入用戶名和密碼,這種驗證方式不太友好,一般不會提供給普通用戶使用。

PUT & DELETE

切換AJAX的請求爲PUT或DELETE,能夠進行更新或是刪除操做,但要指定惟一的id或是slug:

 function ajax_delete()
  {
    $.ajax({
      type : "DELETE",
      url : "/api/p/1/", #刪除id爲1的記錄
      success: function(){
        alert('Submit Success')
      },
    dataType : 'json',
    contentType : 'application/json',
    });
  }

更新操做使用PUT請求,能夠直接參考手冊,和添加操做相比,它要指定惟一的slug或是id;和刪除操做相比,它要加上提交的data。

Afterword

Django是一個開放的框架,雖然它已經解決了不少問題,但自己確實有不少作得不夠好的地方,不妨礙咱們去選擇更適合本身的方案。tastypie很適合團隊分工合做,即便是徹底不懂Django的前端,同樣能經過API進行操做,並且能夠與NOSQL數據庫配合使用,至於其餘的功能和用法期待你們挖掘吧。

相關文章
相關標籤/搜索