2010-09-09 54 views
3

我有一些現有的python代碼,它使用django-piston作爲響應返回字典。例如:如何操縱Django-piston中的響應對象?

from piston.handler import BaseHandler 

class FooHandler(BaseHandler): 
    allowed_methods = ('GET',) 

    @classmethod 
    def create(self, request): 
     return { 'foo': 'bar' } 

此代碼工作正常,並序列化爲JSON與相應的HTTP報頭組(我假設這是通過涉及一些發射魔法活塞;獎勵積分,隨意闡明如何行爲也起作用,因爲我仍然認識django-piston)。

我需要能夠以任意方式修改響應,例如,設置標題,狀態代碼等,而無需使用針對特定用途設計的預先解決的解決方案。有沒有一種方便的方法來訪問該代碼上下文中的響應對象並對其進行操作,或者尚未創建響應對象?爲了獲得對響應對象的訪問權限,我需要手動構建它(la香草django),序列化字典,並手動設置適當的標題,從而失去了django-piston的一些有用魔力?

+0

「創造」不應該是一個類方法 – 2011-02-01 18:46:00

+0

每活塞維基:「注意:這些‘資源法’應與@classmethod裝飾裝飾,因爲他們不會永遠接收自己的一個實例。例如,如果您定義了UserHandler,並且您從另一個處理程序返回一個用戶,那麼您將不會收到該處理程序的實例,而是UserHandler。「 – SK9 2012-04-09 20:42:16

回答

1

每個django-piston方法都會返回一個HTTPResponse。

當您返回該字典時,django-piston只是序列化它,並將其粘貼到它製作的一些HTTPResponse中。

有點驚訝,你沒有理解,因爲wiki中所有django-piston示例中的「return rc.CREATED」行只是對HTTP代碼和響應主體的超簡單響應。

到這裏看看:https://bitbucket.org/jespern/django-piston/src/c4b2d21db51a/piston/utils.py

在rc_factory類,它創建了各種與活塞使用的HttpResponse對象。

至少你可以觀察他們是怎麼做的,然後製作你自己的。

但是你的問題的本質的答案「我可以做一個自定義HTTPResponse」是的,你可以。當然,這就是web服務器做的

0

你說的很對,django-piston使用發射器序列化/反序列化請求和響應。你甚至可以用活塞註冊你自己的發射器,並讓它使用它們。

有幾種方法可以確定格式應該是什麼。

1. mime-type 
2. <format> in your URL 
3. .json at the end of your URL 

你想操縱哪個特定的標題?可能還有其他解決方案,然後只是在迴應對象上進行攻擊。

+0

嗯,例如,返回201(資源創建)狀態代碼位置標頭對於REST API來說相當標準。 – fuzzyman 2012-12-18 12:09:10

1

可以通過從處理程序方法返回HttpResponse對象來設置自定義響應代碼。

return HttpResponse({'foo': 'bar'}, status=404) 

不幸的是,您不能以相同的方式設置標題。爲此,您必須編寫一個自定義發射器來設置您需要的標題。這些方針的東西可能會奏效:

class CustomEmitter(JSONEmitter): 
    def render(self, request): 
     content = super(CustomEmitter, self).render(request) 
     response = HttpResponse(content) 
     response['Cache-Control'] = 'max-age=60' 

Emitter.register('json', CustomEmitter, 'application/json; charset=utf-8')