2013-02-01 17 views
1

我從正常的django視圖調用tastypie api。從其他視圖使用tastypie api

def test(request): 

    view = resolve("/api/v1/albumimage/like/user/%d/" % 2) 

    accept = request.META.get("HTTP_ACCEPT") 
    accept += ",application/json" 
    request.META["HTTP_ACCEPT"] = accept 
    res = view.func(request, **view.kwargs) 

    return HttpResponse(res._container) 

Using tastypie resource in view
Call an API on my server from another view

達到同樣的事情,但似乎更難。

我的方式調用api可以接受嗎?
此外,如果我可以在python字典而不是json中獲得結果,那將是非常棒的。
可能嗎?

+0

不,沒有一個正確的方法來獲取python字典的API響應。 –

+0

我看到'from_json'序列化方法,不能以某種方式使用它嗎? – eugene

回答

0

如果您需要字典,這意味着您必須更好地設計您的應用程序。不要在你的觀點和Tastypie方法中做重要的事情。重構它以具有共同的功能。

作爲一般規則,意見必須很小。不超過15行。 使代碼可讀,可重複使用且易於測試。

我會提供了一個例子,使其更清晰,假設在Tastypie方法,你必須創建一個對象一樣,也許發出的一個信號:

class AlbumImageResource(ModelResource): 
    def like_method(self, request, **kwargs): 
     # Do some method checking 

     Like.objects.create(
      user=request.user, 
      object=request.data.get("object") 
     ) 
     signals.liked_object(request.user, request.data.get("object")) 

     # Something more 

但是,如果你需要重複使用的行爲在視圖中,正確的做法是因式分解,在不同的功能:

# myapp.utils 
def like_object(user, object): 
    like = Like.objects.create(
     user=request.user, 
     object=request.data.get("object") 
    ) 
    signals.liked_object(request.user, request.data.get("object")) 
    return like 

現在你可以從你的API方法和您的視圖調用它

而且在你看來...

# Your view 
def test(request, object_id): 
    obj = get_object_or_404(Object, id=object_id) 
    like_object(request.user, obj) 
    return HttpResponse() 

希望它能幫助。

+0

感謝您的回答。這讓我非常失望。我原來分開了'utils'和'view'。我認爲tastypie可以取代'utils'的功能,但我猜不是。爲什麼它被稱爲'API框架'然後當我顯然需要現在有3個組件,'utils','view'和'api'。 – eugene

+0

我的意思是,爲什麼我會用tastypie?我認爲構建核心服務(utils在你的答案中)簡單而健壯是tastypie的工作。我錯了嗎? – eugene

+0

是的,你說得對。它很爛。從技術上講,在你的視圖中使用API​​方法有一些方法,但它不是很好。我認爲Tastypie的設計是以客戶爲中心的。無論如何,如果你之前將它分開,那是件好事。試着再做一遍,這是值得的。 – santiagobasulto