如何为Django的validate_booking视图启用CSRF并返回令牌?及模板释义
Django CSRF令牌处理及模板疑问解答
一、让validate_booking视图返回CSRF令牌(供Postman调用)
你的视图目前仅处理POST请求,而CSRF令牌需要先通过GET请求获取,再在POST请求中携带验证。按以下步骤调整:
确认CSRF中间件已启用
检查项目settings.py的MIDDLEWARE列表,确保包含django.middleware.csrf.CsrfViewMiddleware——这是Django默认启用的配置,一般无需额外修改。修改视图逻辑,支持GET请求返回令牌
导入必要模块,调整视图代码,让GET请求返回CSRF令牌,POST请求保留原有逻辑并验证CSRF:
from django.middleware.csrf import get_token from django.http import JsonResponse, HttpResponseServerError import json @csrf_protect def validate_booking(request): if request.method == "GET": # 获取并返回CSRF令牌 csrf_token = get_token(request) return JsonResponse({"csrf_token": csrf_token}) elif request.method == "POST": # 原有POST业务逻辑 body = json.loads(request.body) booking_details = body["booking_details"] DATA = { "name": booking_details["name"], "nric": booking_details["nric"], "booking_id": booking_details["booking_id"] } return JsonResponse({"status": "success"}, status=200) else: return HttpResponseServerError("Invalid HTTP method")
- Postman调用流程
- 先发送GET请求到该接口,提取返回的
csrf_token值; - 发送POST请求时,在请求头中添加
X-CSRFToken字段,值为获取到的令牌,同时在请求体传入JSON数据即可完成验证。
二、官方文档中a_template.html的含义
a_template.html是Django的HTML模板文件,用于渲染服务器端页面。在官方示例中,render函数会把上下文数据c传入模板,模板内可通过{% csrf_token %}标签自动生成一个隐藏的<input>标签,包含CSRF令牌值。当用户在页面提交表单时,这个令牌会随表单数据自动发送,完成CSRF验证。
这种方式适配传统服务器渲染页面的场景,而你的场景是纯API接口(返回JSON),无需依赖模板,直接通过GET请求返回令牌即可满足需求。
内容的提问来源于stack exchange,提问作者QR827
相关产品推荐
相关产品推荐

