如果POST请求默认是csrf保护的话,在Django中使用@method_decorator(csrf_protect)的目的是什么?

问题描述 投票:0回答:1

我认为所有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.'})
python django django-rest-framework django-views
1个回答
1
投票

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

 的情况并不少见。

© www.soinside.com 2019 - 2024. All rights reserved.