在网站文件中消失 {% csrf_token %}
Disappearing {% csrf_token %} on website file
当我想在我的网站上使用我的注册表格时,我收到错误 403:"CSRF verification failed. Request aborted." 在这个网站的源代码中我意识到它丢失了。这是来自我网站的查看源代码的一部分:
<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>
我对此感到惊讶,因为在我的 Pythonanywhere 文件中存在这段代码。
这是我在 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>
我的网页看不到这段代码,我做错了什么?它在服务器上是缝合的,但在网页上是缝合的 view-source 它不是。
编辑:
这是呈现我的模板的视图:
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)
CSRF 令牌通过调用表单对象上的 hidden_tag
函数包含在 HTML 表单中。
例如检查此 gist,第 6 行。这就是您在 jinja 中添加表单及其元素的方式。
您应该将普通字典和请求对象传递给 template.render()
,而不是 RequestContext
。模板引擎将为您将其转换为 RequestContext
:
template = get_template("osnowa_app/register.html")
context = {'form': form}
output = template.render(context, request)
现在,template.render()
函数将类似字典的对象视为第一个参数,但没有请求作为第二个参数。如果没有请求作为第二个参数,它将类似字典的 RequestContext
转换为普通的 Context
对象。由于 Context
对象没有 运行 上下文处理器,因此您的上下文缺少 csrf 令牌。
或者,您可以只使用 render
shortcut,其中 returns 一个 HttpResponse
对象,其中呈现的模板作为内容:
from django.shortcuts import render
def register(request):
...
return render(request, "osnowa_app/register.html", {'form': form})
ticket #27258 中也讨论了这个特殊案例。
当我想在我的网站上使用我的注册表格时,我收到错误 403:"CSRF verification failed. Request aborted." 在这个网站的源代码中我意识到它丢失了。这是来自我网站的查看源代码的一部分:
<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>
我对此感到惊讶,因为在我的 Pythonanywhere 文件中存在这段代码。
这是我在 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>
我的网页看不到这段代码,我做错了什么?它在服务器上是缝合的,但在网页上是缝合的 view-source 它不是。
编辑: 这是呈现我的模板的视图:
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)
CSRF 令牌通过调用表单对象上的 hidden_tag
函数包含在 HTML 表单中。
例如检查此 gist,第 6 行。这就是您在 jinja 中添加表单及其元素的方式。
您应该将普通字典和请求对象传递给 template.render()
,而不是 RequestContext
。模板引擎将为您将其转换为 RequestContext
:
template = get_template("osnowa_app/register.html")
context = {'form': form}
output = template.render(context, request)
现在,template.render()
函数将类似字典的对象视为第一个参数,但没有请求作为第二个参数。如果没有请求作为第二个参数,它将类似字典的 RequestContext
转换为普通的 Context
对象。由于 Context
对象没有 运行 上下文处理器,因此您的上下文缺少 csrf 令牌。
或者,您可以只使用 render
shortcut,其中 returns 一个 HttpResponse
对象,其中呈现的模板作为内容:
from django.shortcuts import render
def register(request):
...
return render(request, "osnowa_app/register.html", {'form': form})
ticket #27258 中也讨论了这个特殊案例。