django csrf为POST提供禁止的403错误

unftdfkk  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(169)

我正在学习Django,作为教程的一部分,我试图通过表单传递一些数据。GET很好,但是POST给了我一个禁止的403。我在谷歌上搜索并应用了许多技巧,但没有任何帮助。
下面是我的代码:

查看

@csrf_protect
def counter(request):
    template = loader.get_template("counter.html")
    ss = request.POST["cnt"]
    context = {
        "words" : len(ss.split(" "))
    }
    return HttpResponse(template.render(context, request))

形式

<form method="post" action="counter">
{% csrf_token %}
    <textarea name="cnt" rows="10" cols="50"></textarea><br>
    <input type="submit">
</form>

403错误是:
禁止访问(403)请求已中止。帮助失败原因:缺少CSRF令牌。
但在删除cookie后(我读到这可能是cookie的问题),它变成了:
禁止访问(403)请求已中止。您看到此消息是因为此网站在提交表单时需要CSRF Cookie。出于安全原因,需要使用此Cookie,以确保您的浏览器不被第三方劫持。如果您已将浏览器配置为禁用Cookie,请重新启用它们,至少对于本网站或“同源”请求。
这个问题只有在我在设置中注解掉'django.middleware.csrf.CsrfViewMiddleware'并从html表单中删除{% csrf_token %}时才能解决。

5rgfhyps

5rgfhyps1#

根据您提供的内容,您希望在分割文本区域中输入的值后获得长度。为此,请尝试使用request.POST.get('cnt ')。这将为您带来价值。

xv8emn3q

xv8emn3q2#

中间件已经通过使用@csrf_protect保护了这一点,您第二次检查它,因此出现错误:

from django.shortcuts import render

# no @csrf_protect, but still enable CsrfViewMiddleware
def counter(request):
    context = {'words': len(request.POST['cnt'].split())}
    return render(request, 'counter.html', context)

在模板中,我还建议让Django确定(绝对)URL,所以:

<form method="post" action="{% url 'counter %}">
  {% csrf_token %} 
  <textarea name="cnt" rows="10" cols="50"></textarea>
  <br>
  <input type="submit">
</form>

相关问题