我认为DRF中默认所有POST, PUT, DELETE个请求都受到CSRF保护,但我在一些教程视频中看到,他们在大约class-based个视图中使用@method_decorator(csrf_protect)来执行Post和RST请求,所以我也这样做了.

但现在我在想,当这些请求默认受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 setting [Django-doc]中,默认情况下,它应该位于is中.但您可以删除中间件,例如,如果您不想默认保护它.在这种情况下,您只能使用@csrf_protect decorator [Django-doc]来仅对特定视图集执行此操作.

换句话说,您可以 Select 将CsrfViewMiddleware添加到MIDDLEWARE设置中(对于新的Django项目来说,确实如此),然后默认所有视图都受到CSRF保护,除非您用@csrf_exempt decorator [Django-doc]指定此,或者您可以remove中间件,并且仅将certain视图标记为CSRF保护.

禁用CSRF对于API来说很常见,因为这些通常不适用于cookie.因此,如果您制作了一个Django应用程序,例如将为React或Vue应用程序提供服务,那么删除CsrfViewMiddleware的情况并不罕见.

Python相关问答推荐

学习率未更新

在Python中,如何才能/应该使用decorator 来实现函数多态性?

Pandas 群内滚动总和

如何从格式为note:{neighbor:weight}的字典中构建networkx图?

如何在不使用字符串的情况下将namedtuple属性传递给方法?

pyautogui.locateOnScreen在Linux上的工作方式有所不同

DuckDB将蜂巢分区插入拼花文件

Python中的函数中是否有充分的理由接受float而不接受int?

如何使用stride_tricks.as_strided逆转NumPy数组

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

如何通过多2多字段过滤查询集

根据不同列的值在收件箱中移动数据

滚动和,句号来自Pandas列

沿着数组中的轴计算真实条目

django禁止直接分配到多对多集合的前端.使用user.set()

Python中绕y轴曲线的旋转

NumPy中条件嵌套for循环的向量化

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

网格基于1.Y轴与2.x轴显示在matplotlib中