【问题标题】:Disappearing {% csrf_token %} on website file网站文件上的 {% csrf_token %} 消失
【发布时间】:2017-02-12 11:26:10
【问题描述】:

当我想在我的站点中使用我的注册表单时,我收到错误 403:“CSRF 验证失败。请求中止。”在本网站的来源中,我意识到这是缺失的。这是我网站的视图源的一部分:

<div style="margin-left:35%;margin-right:35%;">
<fieldset>
<legend> Wszystkie pola oprócz numeru telefonu należy wypełnić </legend>
    <form method="post" action=".">
        <p><label for="id_username">Login:</label> <input id="id_username" maxlength="30" name="username" type="text" required/></p>
<p><label for="id_email">Email:</label> <input id="id_email" name="email" type="email" required /></p>
<p><label for="id_password1">Hasło:</label> <input id="id_password1" name="password1" type="password" required /></p>
<p><label for="id_password2">Powtórz hasło:</label> <input id="id_password2" name="password2" type="password" required /></p>
<p><label for="id_phone">Telefon:</label> <input id="id_phone" maxlength="20" name="phone" type="text" /></p>
<p><label for="id_log_on">Logowanie po rejestracji:</label><input id="id_log_on" name="log_on" type="checkbox" /></p>
        <input type="submit" value="Rejestracja"><input type="reset" value="Wartości początkowe">
    </form>
</fieldset>
</div>

我对此感到惊讶,因为在我的 Pythonanythere 文件中存在这段代码。

这是我在 Pythonanythere 上的 register.html 文件的一部分:

<div style="margin-left:35%;margin-right:35%;">
<fieldset>
<legend> Wszystkie pola oprócz numeru telefonu należy wypełnić </legend>
    <form method="post" action=".">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Rejestracja"><input type="reset" value="Wartości początkowe">
    </form>
</fieldset>
</div>

我的网页看不到这段代码,我做错了什么?它是在服务器上缝合的,但在网页视图源上却不是。

编辑: 这是呈现我的模板的视图:

def register(request):
    if request.method == 'POST':
    form = FormularzRejestracji(request.POST)
    if form.is_valid():
        user = User.objects.create_user(
            username=form.cleaned_data['username'],
            password=form.cleaned_data['password1'],
            email=form.cleaned_data['email']
        )
        user.last_name = form.cleaned_data['phone']
        user.save()
        if form.cleaned_data['log_on']:
            user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'])
            login(request, user)
            template = get_template("osnowa_app/point_list.html")
            variables = RequestContext(request, {'user': user})
            output = template.render(variables)
            return HttpResponseRedirect("/")
        else:
            template = get_template("osnowa_app/register_success.html")
            variables = RequestContext(request, {'username': form.cleaned_data['username']})
            output = template.render(variables)
            return HttpResponse(output)

else:
    form = FormularzRejestracji()
template = get_template("osnowa_app/register.html")
form = FormularzRejestracji()
variables = RequestContext(request, {'form': form})
output = template.render(variables)
return HttpResponse(output)

【问题讨论】:

  • 你重启服务器了吗?
  • 你能显示呈现这个模板的视图吗?
  • settings.py 中的 SECRET_KEY 是不是每次重启服务器时都会生成?
  • 如何初始化渲染上下文?
  • 我重启了我的服务器很多次都没有成功:(

标签: python html django django-templates pythonanywhere


【解决方案1】:

您应该将一个普通的 dict 和请求对象传递给 template.render(),而不是 RequestContext。模板引擎将为您将其转换为RequestContext

template = get_template("osnowa_app/register.html")
context = {'form': form}
output = template.render(context, request)

现在,template.render() 函数将类似 dict 的对象视为第一个参数,但没有请求作为第二个参数。如果没有请求作为第二个参数,它会将类似字典的 RequestContext 转换为普通的 Context 对象。由于 Context 对象不运行上下文处理器,因此您的上下文缺少 csrf 令牌。

您也可以只使用render shortcut,它会返回一个HttpResponse 对象,并将呈现的模板作为内容:

from django.shortcuts import render

def register(request):
    ...
    return render(request, "osnowa_app/register.html", {'form': form})

ticket #27258 也在讨论这个特殊情况。

【讨论】:

    【解决方案2】:

    通过在表单对象上调用 hidden_tag 函数,将 CSRF 令牌包含在 HTML 表单中。

    例如检查gist,第 6 行。这是您在 jinja 中添加表单及其元素的方式。

    【讨论】:

    • 这似乎不是问题的答案。
    • 这是 Django 模板语言,不是 Jinja2。 {% csrf_token %} 是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2013-08-04
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多