使用Hoppscotch向Django 4.0+发送POST请求时遇CSRF token缺失问题
解决Django 4.0+ 与Hoppscotch POST请求的CSRF验证问题
一、Django端配置调整
首先要解决GET请求无法获取csrftoken cookie的问题,Django默认不会给所有请求自动设置CSRF cookie,尤其是使用DRF的API视图时:
- 确认CSRF中间件启用:检查
settings.py的MIDDLEWARE列表,确保'django.middleware.csrf.CsrfViewMiddleware'存在且未被注释。 - 强制视图返回CSRF Cookie:如果你的POST请求对应DRF的APIView,需在视图类上添加
ensure_csrf_cookie装饰器,让Django在GET请求时返回csrftoken cookie。示例代码:from django.views.decorators.csrf import ensure_csrf_cookie from django.utils.decorators import method_decorator from rest_framework.views import APIView @method_decorator(ensure_csrf_cookie, name='dispatch') class EventView(APIView): def get(self, request): return Response({"status": "ok"}) def post(self, request): # 处理POST请求逻辑 serializer = EventSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) - 跨域配置(若存在跨域):如果Hoppscotch和Django不在同一域名下,需配置CORS。安装
django-cors-headers后,在settings.py中添加:INSTALLED_APPS = [ # ... 'corsheaders', ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', # ... 其他中间件 ] # 允许Hoppscotch的本地域名,生产环境按需修改 CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", ] # 允许携带Cookie(关键,否则CSRF cookie无法被Hoppscotch保存) CORS_ALLOW_CREDENTIALS = True
二、Hoppscotch端操作步骤
Django配置完成后,按以下步骤获取并使用CSRF token:
- 获取CSRF Cookie:在Hoppscotch中向你的视图发送GET请求,此时响应头会包含
Set-Cookie: csrftoken=xxx,确保Hoppscotch的"Enable Cookies"选项已开启(在设置中可找到),它会自动保存这个cookie。 - 添加CSRF请求头:在POST请求的Headers中添加:
- 键:
X-CSRFToken - 值:从Hoppscotch的Cookie管理器或浏览器开发者工具(Application->Cookies)中复制
csrftoken的值。
- 键:
- 启用Cookie携带:在Hoppscotch的请求设置里,开启"Send Cookies"选项,确保请求时携带保存的csrftoken cookie。
三、额外注意事项
- 若使用Django普通视图(非DRF),需确保模板中包含
{% csrf_token %}标签,这样GET请求会自动设置CSRF cookie;纯API接口仍需用ensure_csrf_cookie装饰器。 - 确认POST请求的Content-Type为
application/json,Django的CSRF验证默认支持该类型,但需保证请求头设置正确。
内容的提问来源于stack exchange,提问作者Ixyz
相关产品推荐
相关产品推荐

