【问题标题】:Django. CSRF token missing or incorrect姜戈。 CSRF 令牌丢失或不正确
【发布时间】:2021-10-28 03:02:21
【问题描述】:

我最近才开始学习 Django。 我的密码更改页面有问题

403 失败原因: CSRF 令牌丢失或不正确。

我的用户/urls.py

urlpatterns = [
path(
  'logout/',
  LogoutView.as_view(template_name='users/logged_out.html'),
  name='logout'
),
path( 
  'login/',
  LoginView.as_view(template_name='users/login.html'),
  name='login'
),
path( 
  'password_change/',
  PasswordChangeView.as_view(template_name='users/password_change_form.html'),
  name='password_change_form'
),
path( 
  'password_change/done/',
  PasswordChangeDoneView.as_view(template_name='users/password_change_done.html'),
  name='password_change_done'
),
...,
]

我的模板中的表单开始

<form method="post"
  {% if action_url %}
    action="{% url action_url %}"
  {% endif %}
>
  {% csrf_token %}
  <input type="hidden" name="csrfmiddlewaretoken" value="">

使用此表单,我收到错误 403 和“CSRF 令牌丢失或不正确”。

没有这个字符串,everythink 工作

<input type="hidden" name="csrfmiddlewaretoken" value="">

每个想法都有效。 1)你能解释一下为什么吗?还有,这是什么? 使用 csrf 的最佳方法是什么? 2)我以前也写like

 <form method="post" action="{% url 'users:password_change_form' %}">

但是使用 action_url 创建了这个例子。 什么是 action_url? 哪种方式更好?

【问题讨论】:

    标签: python django django-views django-forms django-templates


    【解决方案1】:

    action 是表单标签中的属性。并且“action_url”是当您单击提交按钮时它转到的 URL(一个页面)。所以你需要在那里定义那个 URL。 Django 中的正确语法是:

    <form action={% url 'process' %}  method="POST">
    

    所以这里的过程是您在 urls.py 文件中定义的那个 URL 的名称。 像这样:

    path('process/', views.process, name='process')
    

    为了工作,您需要在您的应用中拥有该文件。

    因此,在您的情况下,输入您在 ulrs.py 文件中在 if 条件下定义的 URL 的名称。

    【讨论】:

      【解决方案2】:
      1. 尝试仅使用:

        {% csrf_token %}

      而不是

      {% csrf_token %}
       <input type="hidden" name="csrfmiddlewaretoken" value="">
      

      恐怕第二行代码覆盖了csrf_token值。

      1. 表单中的'action' 指定提交表单时将表单数据发送到何处。在这种情况下,表单提交后,它会转到'users'应用,url名称'password_change_form',然后传递给与之关联的视图。

      【讨论】:

      • 1) 是的,它只适用于 {% csrf_token %} 但我不明白为什么,隐藏输入 type="hidden" name="csrfmiddlewaretoken" value="" 2) 我想了解更多关于 action_url 变量的信息,它是什么?不是 action=some_url
      • 1) {% csrf_token %} 将自动转换为type="hidden" name="csrfmiddlewaretoken" value="somesecretkey"。您可以通过检查网页来验证这一点。这些隐藏的输入将以字典的形式 POST 到目标 url,在本例中为 {csrfmiddlewaretoken:"somesecretkey"}。您可以通过在 views.py 中打印 request.POST.get('csrfmiddlewaretoken') 来证明这一点。 2) 我相信 'action_url' 是您在 url.py 中声明的网址之一的名称,对吧?
      • 不,我没有名为“action_url”的网址。我在模板中使用“action_url”,其中路径如 path('url', some ClassBasedView from django.contrib.auth.views, name='some_name') 。但我没有为任何 urls.py 中的任何 url 使用名称“action url”
      猜你喜欢
      • 2012-05-16
      • 2021-07-14
      • 2011-12-26
      • 2014-03-29
      • 1970-01-01
      • 2014-12-25
      • 2014-02-26
      • 2021-10-01
      • 2021-11-13
      相关资源
      最近更新 更多