Django - {% csrf_token %} 在模板中使用,但上下文未提供值

django

1个回答

写回答

myron666

2025-07-05 12:35

+ 关注

Django
Django

Django - 在模板中使用 {% csrf_token %},但上下文未提供值

Django中,为了防止跨站请求伪造(CSRF)攻击,我们经常需要在表单中包含一个 CSRF 令牌。这个令牌是由 Django 自动生成的,并且必须在提交表单时一起发送。幸运的是,Django为我们提供了一种简单的方式来在模板中添加这个令牌。

在模板中使用 {% csrf_token %} 很简单,只需在表单的合适位置插入这个标签即可。例如,我们可以这样编写一个简单的登录表单:

html

<form method="post" action="{% url 'login' %}">

{% csrf_token %}

<label for="username">用户名:</label>

<input type="text" name="username" id="username">

<br>

<label for="password">密码:</label>

<input type="password" name="password" id="password">

<br>

<input type="submit" value="登录">

</form>

在上面的例子中,我们使用了 {% csrf_token %} 标签来插入 CSRF 令牌。这个标签会被渲染成一个隐藏的 input 元素,其中包含了令牌的值。当用户提交表单时,这个令牌会被自动包含在请求中,以确保请求的合法性。

然而,有时我们可能会遇到一个错误,即 "上下文未提供值"。这通常是因为我们在渲染模板时没有提供正确的上下文。解决这个问题很简单,只需确保在视图函数中正确地使用 RequestContext

例如,假设我们的视图函数如下:

Python

from Django.shortcuts import render

def login_view(request):

# 处理登录逻辑

return render(request, 'login.html')

我们需要将 RequestContext 作为第三个参数传递给 render 函数:

Python

from Django.shortcuts import render

from Django.template import RequestContext

def login_view(request):

# 处理登录逻辑

return render(request, 'login.html', context_instance=RequestContext(request))

这样,Django 就会在渲染模板时自动提供正确的上下文,从而解决 "上下文未提供值" 的问题。

使用 {% csrf_token %} 标签来添加 CSRF 令牌非常简单。我们只需在表单中插入这个标签,并确保在视图函数中正确地使用 RequestContext。这样,我们就能有效地防止 CSRF 攻击,并保护我们的应用程序安全。

案例代码:

Python

# views.py

from Django.shortcuts import render

from Django.template import RequestContext

def login_view(request):

# 处理登录逻辑

return render(request, 'login.html', context_instance=RequestContext(request))

html

<!-- login.html -->

<form method="post" action="{% url 'login' %}">

{% csrf_token %}

<label for="username">用户名:</label>

<input type="text" name="username" id="username">

<br>

<label for="password">密码:</label>

<input type="password" name="password" id="password">

<br>

<input type="submit" value="登录">

</form>

希望这篇文章能帮助你理解在Django中如何使用 {% csrf_token %} 标签,并解决可能遇到的 "上下文未提供值" 错误。记得始终关注应用程序的安全,防止跨站请求伪造攻击的发生。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号