【问题标题】:CSRF token missing or incorrect - DjangoCSRF 令牌丢失或不正确 - Django
【发布时间】:2021-11-13 08:20:11
【问题描述】:

我正在尝试构建一个 Django webapp 来测试我使用pip 安装的外汇转换器的功能。我使用django-startapp Converter 创建了一个应用程序,并将网址/convert 路由到视图convert_view()。

这是我的views.py 文件:

from django.shortcuts import render

from forex_python.converter import CurrencyRates

# Create your views here.

def convert_view(request):
    if request.method == "POST":
        c = CurrencyRates()
        print(c.convert('EUR', 'RON', request.POST.get('eur')))
    context = {}
    return render(request, "convert.html", context)

另外,因为我的视图返回一个模板convert.html,所以我在那里创建了一个表单。这是我的convert.html:

{% csrf_token %}

<form action="." method="POST">
    <input type="text" name="eur" placeholder="EUR">
    <input type="submit">
</form>

如您所见,只是一个包含表单的简单页面,重定向到同一页面并使用POST 发送数据。它还使用{% csrf_token %}标签,所以应该没有任何问题。

当我导航到 /convert 时,一切正常。我输入了我想从 EUR 转换为 RON 的金额,但是当我发送 POST 请求时,我被重定向到一个错误页面,告诉我:

CSRF 令牌丢失或不正确。

我阅读了另一篇关于堆栈溢出的文章,关于不在render() 函数中使用request 作为参数,但我正在这样做。

怎么了?我能做些什么来解决这个错误?谢谢。

【问题讨论】:

  • {% csrf_token %} 需要在 &lt;form&gt; 标签内。请参阅页面源代码 - {% csrf_token %} 生成一个 &lt;input&gt;,如果您不将此输入放入表单中,则该值不会发送。
  • @yedpodtrzitko 非常感谢!这实际上是我第一次与 Django 合作并且不知道这一点。你能把它放在一个正确的答案中,所以我可以把它标记为正确吗?

标签: python django django-views django-csrf csrf-token


【解决方案1】:

您需要将{% csrf_token %} 放入&lt;form&gt; 标记中,如下所示:

<form action="." method="POST">
    {% csrf_token %}
    <input type="text" name="eur" placeholder="EUR">
    <input type="submit">
</form>

【讨论】:

    【解决方案2】:

    请将{% csrf_token %} 放入&lt;form&gt; 标签内。这将解决问题。

    【讨论】:

      【解决方案3】:

      {% csrf_token %} 应该在表单标签内。 像这样

      <form action="." method="POST">
      {% csrf_token %}
             <input type="text" name="eur" placeholder="EUR">
             <input type="submit">
      </form>
      

      其背后的原因是因为{% csrf_token %} 是这样渲染的,并且为了将输入与表单一起提交,它需要在表单元素内。

      <input type="hidden" name="csrfmiddlewaretoken" value="0gdrskkUXOTenFZOWxhzQPZWavohLKrEaOm0aKj8KzOfeLFah9PihEdYG24Fl4F7">```
      

      【讨论】:

        【解决方案4】:

        您的表单文件中有错误,您的 csrf_token 应该在您的标签内,因为 django 期望它与表单数据一起证明您发送的内容是安全的。试试这个

           <form action="." method="POST">
                  {% csrf_token %}
                   <input type="text" name="eur" placeholder="EUR">
                   <input type="submit">
             </form>
        

        它会这样工作。

        【讨论】:

          猜你喜欢
          • 2021-07-14
          • 2012-04-20
          • 2012-09-25
          • 1970-01-01
          • 1970-01-01
          • 2016-05-12
          • 2016-06-10
          • 2017-09-14
          • 2019-12-04
          相关资源
          最近更新 更多