0

您好,我是一个新手,试图使用 django 注册一些用户,我一直在阅读 Django Book 并且正在阅读关于注册的章节,http://www.djangobook.com/en/2.0/chapter14/当我这样做时指示我明白了

禁止 (403)

CSRF 验证失败。请求中止。帮助

失败原因:

CSRF token missing or incorrect.

通常,当存在真正的跨站点请求伪造时,或者未正确使用 Django 的 CSRF 机制时,可能会发生这种情况。对于 POST 表单,您需要确保:

Your browser is accepting cookies.
The view function uses RequestContext for the template, instead of Context.
In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.

您看到此页面的帮助部分是因为您的 Django 设置文件中有 DEBUG = True 。将其更改为 False,将仅显示初始错误消息。

您可以使用 CSRF_FAILURE_VIEW 设置自定义此页面。

我将 {% csrf_token %} 模板标签放在post 标签内,它仍然给我这个错误。谢谢

#  views.py
#  
#  Copyright 2012 Talisman <KlanestroTalisman@gmail.com>
from django.shortcuts import render_to_response
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect

def home (request):
    return render_to_response('FirstTemplate.html',)

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/books/")
    else:
        form = UserCreationForm()
    return render_to_response("register.html", {
        'form': form,
    })

形式

{% extends "base.html" %}

{% block title %}Create an account{% endblock %}

{% block content %}
  <h1>Create an account</h1>

  <form action="" method="post"{% csrf_token %}>
      {{ form.as_p }}
      <input type="submit" value="Create the account">
  </form>
{% endblock %}
4

2 回答 2

1

Djangobook 使用了相当旧的 django 版本,您可能使用的是较新的版本,我已经尝试了这些信息,并且 csrf 部分肯定是过时的,因为他们对较新版本中的处理方式进行了一些修改,请将您的 django 版本与本书相匹配版本,这个错误的一些常见原因(除了pahko提到的中间件)是

  1. 不在模板中使用 csrf_token 标记
  2. 不使用 RequestContext 类 - 用 RequestContext 替换 Context

像这样

from django.template import RequestContext

并在渲染语句中

return render_to_response("home/index.html", c, context_instance=RequestContext(request))

注意:在上述语句中使用您自己的模板路径。

于 2012-08-16T19:00:10.410 回答
0

尝试将其放入 settings.py 中的中间件配置中

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware',
)

希望能帮助到你

于 2012-08-16T18:23:36.090 回答