使用djangorestframework的HTTPS PUT请求

时间:2012-07-06 21:28:59

标签: django django-rest-framework

我正在尝试使用djangorestframework(DRF:http://django-rest-framework.org/)视图向RESTful API Django Web服务发送HTTPS PUT请求。由于Django的跨站点请求伪造(CSRF)保护,我无法使其工作。

PUT请求旨在允许未经身份验证的用户添加资源。

我考虑过/尝试过:

  1. 禁用CSRF - 不可接受。 API在与非API服务相同的Django实例上运行。禁用CSRF保护风险太大。
  2. 在PUT请求中使用X-Requested-With: XMLHttpRequest标头(我控制客户端)。不起作用 - 我仍然收到CSRF错误。
  3. 在PUT视图上使用@crsf_exempt装饰器。如果可以的话,我会 - 框架定义一个类,而不是一个视图。
  4. 我目前最好的选择是自己编写PUT视图而不使用DRF的View类。然后我可以成功使用@crsf_exempt装饰器。

    我想使用DRF的View类 - 但是看不清楚如何。你能吗?

1 个答案:

答案 0 :(得分: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