我认为所有POST、PUT、DELETE请求在DRF中默认受到CSRF保护,但我在一些教程视频中看到他们在一些带有POST和DELETE的
基于类的视图上使用
@method_decorator(csrf_protect)
请求,所以我也这样做了。
但现在我在想,当这些请求默认受到 CSRF 保护时,这样做的目的是什么?
@method_decorator(csrf_protect, name='dispatch')
class LogoutView(APIView):
def post(self, request, format=None):
try:
auth.logout(request)
return Response({'success': 'Logged out.'})
except Exception as e:
print(e)
return Response({'error': 'Something went wrong.'})
POST 请求通常受到 CSRF 伪造的保护,是的。但这不是由 Django 本身完成的,而是由
CsrfViewMiddleware
[Django-doc] 完成的。因此,这个中间件应该位于 MIDDLEWARE
设置[Django-doc],默认情况下,它是。但是您可以删除中间件,例如,如果您不想默认保护它。在这种情况下,您可以使用 @csrf_protect
装饰器[Django-doc] 仅在一组特定视图上执行此操作。
换句话说,您可以选择将 CsrfViewMiddleware
添加到
MIDDLEWARE
设置(对于新的 Django 项目来说,就是这样),然后所有视图默认都受到 CSRF 保护,除非您使用指定这一点
@csrf_exempt
装饰器[Django-doc],或者您可以删除中间件,并仅标记某些受CSRF保护的视图。
禁用 CSRF 对于 API 来说很常见,因为它们通常不适用于 cookie。因此,如果您创建一个 Django 应用程序,例如将服务于 React 或 Vue 应用程序,则删除 CsrfViewMiddleware
的情况并不少见。