已添加CSRF令牌仍提交缺失,Django手机号验证报错
Django表单提交“CSRF token missing”问题解决
你的问题根源在于直接用字符串拼接返回HTML时,Django模板标签{% csrf_token %}未被解析——HttpResponse返回的是纯文本,不会触发Django的模板渲染引擎,导致表单里的CSRF标签只是普通文本,没有生成实际的token字段。
推荐解决方案:改用Django模板系统渲染页面
- 在你的App目录下创建
templates文件夹,新建verify_phone.html文件,写入以下内容:
<!DOCTYPE html> <html> <head> <title>Verify Phone Number</title> </head> <body> <h1>Verify Your Phone Number</h1> <form method="post"> {% csrf_token %} <label for="phone_number">Phone Number:</label> <input type="text" id="phone_number" name="phone_number" required> <button type="submit">Verify</button> </form> </body> </html>
- 修改视图函数,用
render替代HttpResponse来返回模板:
from django.shortcuts import render from django.contrib.auth.decorators import login_required @login_required def verify_phone_number(request): if request.method == 'POST': # 调用Twilio API发起手机号验证的代码 # 若验证请求未发送需返回页面,同样用render返回模板 return render(request, 'verify_phone.html') else: return render(request, 'verify_phone.html')
临时应急方案(不推荐生产环境使用)
如果暂时不想搭建模板结构,可以手动生成CSRF token并插入到HTML字符串中:
from django.middleware.csrf import get_token from django.contrib.auth.decorators import login_required @login_required def verify_phone_number(request): csrf_token = get_token(request) if request.method == 'POST': # 调用Twilio API发起手机号验证的代码 # 返回页面时需传入token html_content = f""" <!DOCTYPE html> <html> <head> <title>Verify Phone Number</title> </head> <body> <h1>Verify Your Phone Number</h1> <form method="post"> <input type="hidden" name="csrfmiddlewaretoken" value="{csrf_token}"> <label for="phone_number">Phone Number:</label> <input type="text" id="phone_number" name="phone_number" required> <button type="submit">Verify</button> </form> </body> </html> """ return HttpResponse(html_content) else: html_content = f""" <!DOCTYPE html> <html> <head> <title>Verify Phone Number</title> </head> <body> <h1>Verify Your Phone Number</h1> <form method="post"> <input type="hidden" name="csrfmiddlewaretoken" value="{csrf_token}"> <label for="phone_number">Phone Number:</label> <input type="text" id="phone_number" name="phone_number" required> <button type="submit">Verify</button> </form> </body> </html> """ return HttpResponse(html_content)
关键说明
Django的模板标签(如{% csrf_token %})只有在经过模板渲染引擎处理时才会被解析为有效HTML元素。直接返回字符串的话,标签会被原样输出,无法生成包含CSRF token的隐藏输入框,这就是提交时出现错误的原因。
内容的提问来源于stack exchange,提问作者jessiepinkman
相关产品推荐
相关产品推荐

