我有一个Django webapp,它既有前端的,可通过Web访问的组件,也有桌面客户端访问的API。但是,现在使用新的CSRF中间件组件,来自桌面客户端的POST请求的API请求将获得403.
我理解为什么会发生这种情况,但在不影响安全性的情况下解决这个问题的正确方法是什么?有没有我可以在HTTP标头中发信号通知它是一个API请求,Django不应该检查CSRF或者这是一个糟糕的策略?
编辑 -
我目前使用的方法是桌面客户端设置标题,X-Requested-With:XMLHttpRequest。这有点像hacky,但我不确定如何更好地处理它。
答案 0 :(得分:10)
如何为桌面客户端分割视图并使用csrf_exempt进行装饰?
答案 1 :(得分:7)
如果您使用的是基于类的视图,那么您将需要csrf_exempt调度方法而不是像这样的post方法:
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super(MyView, self).dispatch(request, *args, **kwargs)
答案 2 :(得分:-3)
自Django 1.1起,CSRF代码将自动允许AJAX请求通过,因为浏览器似乎进行了适当的安全检查。这是original commit和documentation。