- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个登录表单,我希望它在我的所有 View 中都可用,因此我创建了一个上下文处理器来将此表单添加到每个加载的上下文中。
问题是 {% csrf_token %}
在表单模板上不会呈现具有 CSRF token 值的隐藏输入标签。
这是 settings.py
中的上下文处理器顺序:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.request',
'django.core.context_processors.csrf',
'absolute.context_processors.absolute',
'myproject.app.context_processors.base',
)
然后处理器本身在 app/context_processors.py
上:
from django.contrib.auth.forms import AuthenticationForm
def base(request):
context = dict()
if not request.user.is_authenticated():
context['login_form'] = AuthenticationForm()
return context
表单模板:
{% load i18n %}
<form method="post" action="{% url "django.contrib.auth.views.login" %}">
{% csrf_token %}
<input type="hidden" name="next" value="{% if request.GET.next %}{{ request.GET.next }}{% else %}{{ request.get_full_path }}{% endif %}" />
{{ login_form.as_p }}
<input type="submit" class="button success expand" value="{% trans 'Login' %}" />
</form>
此表单的 HTML 输出:
<form action="/accounts/login/" method="post">
<input type="hidden" value="/" name="next">
<p><label for="id_username">Usuário:</label> <input type="text" name="username" maxlength="254" id="id_username"></p>
<p><label for="id_password">Senha:</label> <input type="password" name="password" id="id_password"></p>
<input type="submit" value="Login" class="button success expand">
</form>
提交时出现的错误:
CSRF verification failed. Request aborted.
但是,由于我只使用基于类的 View ,如果我添加 csrf_protect
decorator 表单将工作,但像这样我必须声明 dispatch
我所有观点中的方法:
from django.views.decorators.csrf import csrf_protect
class HomeView(TemplateView):
template_name = 'home.html'
@method_decorator(csrf_protect)
def dispatch(self, *args, **kwargs):
return super(HomeView, self).dispatch(*args, **kwargs)
我放弃了通过创建登录表单页面将 AuthenticationForm 放在我的所有 View 中。不管怎样,如果有人能帮我找到解决这个问题的方法,那还是很棒的。
最佳答案
我花了几个小时来解决与您在此处描述的问题类似的问题。 {% csrf_token %}
没有渲染任何东西,我在 Debug模式下看到了这个:
defaulttags.py:66: UserWarning: A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext.
我使用的是从 TemplateView 继承的简单 View :
class MenuIndexView(TemplateView):
template_name = 'menu/index.html'
def get_context_data(self, **kwargs):
kwargs = super().get_context_data(**kwargs)
session = self.request.session
kwargs['zip_code'] = session.get('zip_code')
kwargs['calendar'] = helpers.get_menu_calendar(date.today() + timedelta(days=1), timedelta(days=14))
kwargs['forms'] = {'zip_code': forms.ZipCodeForm({'zip_code': session.get('zip_code')})}
return kwargs
在 Django 下大惊小怪之后,我意识到在生成标签的地方几乎没有可用的上下文(Django 的 defaulttags.py
文件上的 CsrfTokeNode
) :
class CsrfTokenNode(Node):
def render(self, context):
csrf_token = context.get('csrf_token', None)
if csrf_token:
if csrf_token == 'NOTPROVIDED':
return format_html("")
else:
return format_html("<input type='hidden' name='csrfmiddlewaretoken' value='{}' />", csrf_token)
else:
# It's very probable that the token is missing because of
# misconfiguration, so we raise a warning
if settings.DEBUG:
warnings.warn(
"A {% csrf_token %} was used in a template, but the context "
"did not provide the value. This is usually caused by not "
"using RequestContext."
)
return ''
在这段代码中,我只看到上下文中的一个项目,带有 zip_code
键。
我打开主模板文件并意识到我犯了一个新手错误 - 这是我的主模板 menu/index.html
:
{% extends 'base.html' %}
{% block content %}
<div class="menu-order-meta zip_calendar">
<div class="ink-grid align-center">
<div class="column-group gutters half-vertical-padding medium">
{% include 'partials/menu/zip-code.html' with zip_code=zip_code only %}
</div>
</div>
</div>
{% endblock %}
我通过部分模板包含表单,并且我明确限制了该部分模板中的可用上下文 - 注意 with zip_code=zip_code only
声明 -(并且通过这样做,隐式地将csrf_token
上下文处理器不可用)。
关于python - Django 上下文处理器和 csrf_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985180/
我读到这两个基本上是同一回事,但每个都给我不同的错误,我不确定该去哪一个。我什至不知道如何解决这个问题。有人可以看看我的代码吗,我已经为此苦苦挣扎了两天。 我的html $(docume
在搜索结果网址中包含csrf。不知道为什么在那里,以及如何删除它。搜索效果很好。这是网址 /search/?csrfmiddlewaretoken=675d1340034e094866d15a9214
我在 django 教程中做 wiki 并且在教程中使用 django 的早期版本,其中 csrf token 不是强制性的。我已将 {% csrf_token %} 添加到表单中,但是我不确定在 V
Django 1.9.5CSRF token 未添加隐藏表单字段。尝试使用 RequestContext 进行 render_to_request,只是渲染,尝试装饰器 - 没有任何效果,隐藏的输入不
我在 Jquery Ajax 中使用 CodeIgniter3 将一些数据插入数据库。 但是,当用户插入如下内容时,我使用csrf_token来制作安全表单数据。 问题我无法在 Chrome 浏览器上
当我想在我的网站上使用我的注册表时,我收到错误 403:“CSRF 验证失败。请求已中止。”在本网站的源代码中,我意识到它丢失了。这是我网站上查看源代码的一部分: Wszystkie pola
我很好奇:我知道 Django 中有两种 csrf 保护方式:模板中的 {% csrf_token %} 和 View 中的 @csrf_protect。 所以,问题是:它们可以互换吗?我的意思是我可
我正在尝试在 Django 中执行单元测试。我在 index.html 中有以下表格: {% csrf_token %} 我正在测试 View 是否正确呈现模板: View .py de
我是 Django 新手,我仍在尝试掌握它的功能。我使用 Django 1.4.2 创建了一个非常简单的项目,它具有简单形式的索引页面,您可以在其中输入内容,还可以在结果页面中在提交后显示您的输入(代
我有一个在 1.2.1 上运行的 django 站点,有时我的用户会失去很多工作,因为 csrf_token cookie 不存在并且页面错误并在发布时出现 403 错误。我将范围缩小到另一个站点(我
我正在一个 Django 项目中工作,部分功能是用户登录,但它不起作用。同一段代码在 10 分钟前运行得很好。 错误:模板中使用了 csrf_token,但上下文未提供该值。 仅供引用,我已经尝试使用
我正在尝试将 reactjs 与 laravel 集成。所以我所做的是,通过使用一些命令将我的 js 从 vue 更改为 react。然后我在 /resources/js/components 下添加
我有一个动态生成的表单,但我不能用它做任何事情,因为 Django 在每个 POST 表单中都需要一个 csrf_token。 我的表单是通过以下方式生成的: $("#results").append
我有一个登录表单,我希望它在我的所有 View 中都可用,因此我创建了一个上下文处理器来将此表单添加到每个加载的上下文中。 问题是 {% csrf_token %}在表单模板上不会呈现具有 CSRF
我的views.py: from django.core.context_processors import csrf from django.views.decorators.csrf import
网站可以将 csrf_token 显示为 URL 参数吗?我有一种感觉,我应该看不到它,但我不太确定。如果有人能澄清这一点,我将不胜感激! 最佳答案 不,这是 Not Acceptable 。 在 U
我需要使用 csrf_token 连接一些文件(来自 laravel),但我有未知错误,例如: 语法错误,意外的 ''css/app.css)); ?>">' (T_ENCAPSED_AND_WHI
尽管我已经添加了所有必要的中间件类,但在 Django (1.2.5) 中的表单上添加 csrf_token 时遇到了一些问题 {% csrf_token %} 给出...name 'csrf_tok
这是一个简单的问题。 我正在尝试使用 Angular 5 和 Drupal 8 作为后端进行登录。连接工作正常,我可以将 JSON 发送到 Drupal 站点,它会返回一个 CSRF token 。
在不使用表单的 Django 模板中,我想将文件上传到我的 Web 服务器。因此,我正在使用名为 dropzonejs 的 javascript 库。 我完全遵循本教程 bootstrap dropz
我是一名优秀的程序员,十分优秀!