出现原因

当您使用SessionAuthentication 时,您正在使用 Django 的身份验证,这通常需要检查 CSRF。Django REST Framework 强制执行此操作,仅适用于SessionAuthentication,因此您必须在X-CSRFToken标头中传递 CSRF 令牌。

出现场景

在对外提供一些开放性 api 时,对方是不需要携带 csrf_token 的,但是在我们框架中是使用了 SessionAuthentication 方式对用户进行认证的,自己使用时我们会遵守认证方式的规范进行传递有效的 csrf_token,对外开放时就要屏蔽这种认证方式,解决办法:

from rest_framework.authentication import SessionAuthentication

class CsrfExemptSessionAuthentication(SessionAuthentication):

    def enforce_csrf(self, request):
        return  # To not perform the csrf check previously happening

代码解析:
编写一个类继承自 SessionAuthentication, 重写 enforce_csrf 方法,
如果返回一个 None,则代表不执行之前发生的 csrf 检查。

视图中使用:
class Object(APIView):
    authentication_classes = (CsrfExemptSessionAuthentication, )

    def post(self, request, format=None):
    	pass

关于 csrf_exempt

关于其他网址所说的设置 csrf_exempt,那都是后面的操作,用户请求网站,首先要做的就是关于用户验证,只有认证通过了,后续的操作才可以使用 csrf_exempt 来对视图进行 csrf 的豁免。

登录豁免


from django.views.decorators.csrf import csrf_exempt
from rest_framework import permissions


class XViewSet(ModelViewSet):
    permission_classes = [permissions.AllowAny]

    @classmethod
    def as_view(cls, actions=None, **kwargs):
        view = super(UserViewSet, cls).as_view(actions=actions, **kwargs)
        return csrf_exempt(login_exempt(view))

参考文献

摘自:https://stackoverflow.com/questions/26639169/csrf-failed-csrf-token-missing-or-incorrect

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐