2012-07-06 108 views
4

我試圖使用djangorestframework(DRF:http://django-rest-framework.org/)查看將HTTPS PUT請求發送到RESTful API Django Web服務。由於Django的跨站點請求僞造(CSRF)保護,我無法使其工作。使用djangorestframework的HTTPS PUT請求

PUT請求旨在允許未經身份驗證的用戶添加資源。

我曾考慮/嘗試:

  1. 禁用CSRF - 不能接受的。 API與非API服務在相同的Django實例上運行。禁用CSRF保護的風險太大。
  2. 在PUT請求(我控制客戶端)上使用X-Requested-With: XMLHttpRequest標頭。不起作用 - 我仍然得到CSRF錯誤。
  3. 在PUT視圖上使用@crsf_exempt裝飾器。如果可以的話,我會 - 框架定義了一個類,而不是一個視圖。

我目前最好的選擇是自己編寫PUT視圖,而不使用DRF的View類。然後,我可以成功使用@crsf_exempt修飾器。

我想使用DRF的View類 - 但看不到如何。你可以嗎?

回答

4

感謝James Cran Wellward,我也可以通過使用method_decorator來解決這個問題。

class ExampleView(ResponseMixin,View): 
    renderers=DEFAULT_RENDERERS 
    def get(self,request): 
    response=Response(200,{'msg':'called via GET'}) 
    return self.render(response) 
    def post(self,request): 
    response=Response(200,{'msg':'called via POST'}) 
    return self.render(response) 
    @method_decorator(csrf_exempt): 
    def dispatch(self,*args,**kwargs): 
    return super(EampleView,self).dispatch(*args,**kwargs) 

和然後對其進行測試:

curl -X GET http://www.example.com/rest/exampleview/ 

回報:

{msg: 'called via GET'} 

curl -X POST http://www.example.com/rest/exampleview/ 

回報:

{msg: 'called via POST'} 

HTH。請參閱original post

+0

由於我問了這個問題,我已經轉移到django-tastypie - 所以我不能輕易驗證這一點。但是,你的答案看起來很有說服力! – Erik 2012-07-15 04:01:09