2011-08-10 68 views
23

我正在尋找使backbone.js(加上jQuery)與我的Django應用程序一起工作,但我有一些問題。我以前從未使用過安靜的設置,所以我對使用REST的「正確」方式知之甚少。django和backbone.js問題

  1. 骨幹使用REST體系結構,但django默認不支持此功能。看起來tastypie或活塞是實現REST api的方式。這是否意味着我必須將API用於通過主幹進行的任何ajax調用?如果這是正確的,是否有任何性能問題或其他我需要注意的古怪事項?

  2. 我的大部分django應用都需要驗證。我的理解是REST api沒有關於用戶是否被認證的任何概念,那麼我該如何處理?我仍然可以使用我的視圖使用登錄所需的裝飾器,或者我還有其他事情嗎?

  3. 怎麼樣Django的權限框架,我仍然能夠設置/檢查權限和組?

請隨時單獨回答每個問題,或者如果您能看到我的整體困惑,請指向正確的方向。

其中的一些可能對你很多人來說都很不明顯,但它讓我感到困惑,所以在此先感謝你的幫助。

回答

21

您可以將骨幹集合/模型指向任何您想要的url並解析您想要的骨幹「子類」中的響應。

Model.url:

http://documentcloud.github.com/backbone/docs/backbone.html#section-43

Collection.parse:

http://documentcloud.github.com/backbone/docs/backbone.html#section-69

您可以設置一次性請求處理,可以返回一些JSON爲骨幹,以解析/攝取不活塞或tastypie。但是,是的,這對於使用django的綜合REST來說是兩個很好的解決方案。

這裏有一些很好的提示:http://joshbohde.com/blog/backbonejs-and-django使用骨幹與tastypie。

使用tastypie,您可以通過自定義授權/驗證來限制對api的訪問。

http://django-tastypie.readthedocs.org/en/latest/authentication_authorization.html

您可以創建一個授權方案,該方案可以確保對象列表進行過濾,只在該用戶「擁有」這樣的對象,東西:

class PerUserAuthorization(Authorization): 
    def apply_limits(self, request, object_list): 
    if request and hasattr(request, 'user'): 
     if request.user.is_authenticated(): 
      object_list = object_list.filter(user=request.user) 
      return object_list 

    return object_list.none() 

或者/附加,您可以通過覆蓋ModelResource.apply_authorization_limits方法來創建只返回用戶對象的資源,並通過覆蓋obj_create方法自動將用戶與創建的對象關聯起來,如下所示:

class PerUserModelResource(ModelResource): 

    def obj_create(self, bundle, request=None, **kwargs): 
    return ModelResource.obj_create(self, bundle, request, user=request.user) 

    def apply_authorization_limits(self, request, object_list): 
    return object_list.filter(user=request.user) 

然後,您可以從PerUserModelResource繼承和/或使PerUserAuthorization成爲資源的授權。

class ImageGroupResource(PerUserModelResource): 
    study = fields.ForeignKey(StudyResource, "study") 
    uploads = fields.ToManyField('cm.api.UploadResource', 'uploads', null=True) 

    class Meta: 
    queryset = ImageGroup.objects.all() 
    list_allowed_methods = ['get', 'post'] 
    detail_allowed_methods = ['get', 'post', 'put', 'delete'] 
    resource_name = 'cm/imagegroup' 
    authorization = PerUserAuthorization() 
    filtering = { 
     'name': ALL, 
     'created_dt': ['exact', 'range', 'gt', 'gte', 'lt', 'lte'], 
    } 

骨幹和django-tastypie有很好的記錄。花時間建立一個簡單的概念驗證並閱讀文檔幾次。他們像豌豆和胡蘿蔔一樣走到一起。

+0

感謝您的回覆。關於權限和組,是否可以實現和使用它們? – imns

+1

當然,只需使用相同的方法,而不是僅使用用戶的身份來應用限制,而是使用組狀態或任意條件。 –