Django的缺點之一,就是它不支持AJAX。好吧,我知道這麼一說又會有一羣人反駁:Django有各類模塊能夠提供AJAX功能;寫一個XML的view來實現AJAX;整合pyjams就什麼功能都有了云云。嘛,均可以,我這也只是分享一個可行的方案,並非惟一的。若是這個方案正好適合你的項目,那直接拿去用不是更省時間嗎?javascript
首先說一下如今項目的狀況,前端工程師想用AJAX的方式(依賴於jQuery),經過POST/GET/PUT請求,提交JSON/XML/YAML格式的數據給後臺數據庫暴露出的一個API地址,以實現對後臺數據的操做。若是在view裏寫一個函數來作比較麻煩,因此使用tastypie直接根據定義的model生成一個API。html
須要安裝django-tastpie, python-digest, python-dateutil, mimeparse。最近由於某些緣由國外的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請求發送一個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的驗證方式,就是咱們常看到的,彈出一個難看的文本框,而後然你輸入用戶名和密碼,這種驗證方式不太友好,一般不會提供給普通用戶使用。
切換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。
Django是一個開放的框架,雖然它已經解決了不少問題,但自己確實有不少作得不夠好的地方,不妨礙咱們去選擇更適合本身的方案。tastypie很適合團隊分工合做,即便是徹底不懂Django的前端,同樣能經過API進行操做,並且能夠與NOSQL數據庫配合使用,至於其餘的功能和用法期待你們挖掘吧。