4

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

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

我考虑过/尝试过的:

  1. 禁用 CSRF——不可接受。API 与非 API 服务在同一个 Django 实例上运行。禁用 CSRF 保护风险太大。
  2. 使用X-Requested-With: XMLHttpRequestPUT 请求的标头(我控制客户端)。不起作用 - 我仍然收到 CSRF 错误。
  3. 在 PUT 视图上使用@crsf_exempt装饰器。如果可以的话,我会的——框架定义了一个类,而不是一个视图。

我目前最好的选择是自己编写 PUT 视图,而不使用 DRF 的 View 类。然后我可以@crsf_exempt成功使用装饰器。

我想使用 DRF 的 View 类——但看不到如何使用。你可以吗?

4

1 回答 1

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。见原帖

于 2012-07-15T03:31:26.773 回答