2012-07-06 62 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