CSRF 令牌丢失或不正确 - Django

CSRF token missing or incorrect - Django

我正在尝试构建一个 Django webapp 来测试我用 pip 安装的外汇转换器的功能。我使用 django-startapp Converter 创建了一个应用程序并将 url /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)

此外,因为我的视图 returns 模板 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 token missing or incorrect.

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

怎么了?我该怎么做才能修复此错误?谢谢。

您需要将 {% csrf_token %} 放在 <form> 标签内,如下所示:

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

请将 {% csrf_token %} 放在 <form> 标签内。这将解决问题。

{% 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">```

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

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

它将以这种方式工作。