DRF 问题处理: 接收到post请求时返回403

在这里插入图片描述

问题排查

这是报错
在这里插入图片描述

  • setting文件中是否关闭了 csrf
    在这里插入图片描述
    如果只是django的话,就会生效,但是如果你不幸运用了drf,那么还得往下看
  • 因为Drf默认使用了如下配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ]
}

其中SessionAuthentication是会进行csrf token校验的,所以仍然会报错

  • 解决办法如下
    1、投机取巧的方法
    对于登录页面有必要这样做,因为再登录的时候,并没有获取到csrf token
from rest_framework.authentication import SessionAuthentication
# 重写一个认证的类
class UnsafeSessionAuthentication(SessionAuthentication):

	# 什么也不做
    def enforce_csrf(self, *args, **kwargs):
        """
        Bypass the CSRF checks altogether
        """
        pass

class UserViewSet(viewsets.ViewSet):
	# 让你的视图使用重写的认证类
    queryset = User.objects.all()
    authentication_classes = (UnsafeSessionAuthentication,)

2、使用其他认证方法

# 改setting.py文件
# 改成你认为比较合适的认证方法,官方提供的还有 BasicAuthentication TokenAuthentication RemoteUserAuthentication Custom authentication(自定义token)
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
    ]
}

3、除登录页面以外的页面,可以这么做

# 打开csrf
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

前端页面,向后端请求的时候,添加x-csrftoken头部,我用的是vue + axios + ts,示例代码如下:

// 获取cookie的方法
function getCookie(name:string) {
  let cookieValue = null;
  if (document.cookie && document.cookie !== '') {
      const cookies = document.cookie.split(';');
      for (let i = 0; i < cookies.length; i++) {
          const cookie = cookies[i].trim();
          // Does this cookie string begin with the name we want?
          if (cookie.substring(0, name.length + 1) === (name + '=')) {
              cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
              break;
          }
      }
  }
  return cookieValue;
}
// axios请求拦截器
instance.interceptors.request.use(
        (config: AxiosRequestConfig) => {
        // 添加csrf token
        config.headers['X-CSRFtoken'] = getCookie('csrftoken')}
        )
)
// 把浏览器关于本站的所有cookie清除掉,刷新进行重试
# drf 认证的官网链接
https://www.django-rest-framework.org/api-guide/authentication/#basicauthentication
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值