You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已添加CSRF令牌仍提交缺失,Django手机号验证报错

Django表单提交“CSRF token missing”问题解决

你的问题根源在于直接用字符串拼接返回HTML时,Django模板标签{% csrf_token %}未被解析——HttpResponse返回的是纯文本,不会触发Django的模板渲染引擎,导致表单里的CSRF标签只是普通文本,没有生成实际的token字段。

推荐解决方案:改用Django模板系统渲染页面

  1. 在你的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>
  1. 修改视图函数,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:27:45