Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django中的csrf错误_Python_Django_Csrf_Django Csrf - Fatal编程技术网

Python django中的csrf错误

Python django中的csrf错误,python,django,csrf,django-csrf,Python,Django,Csrf,Django Csrf,我想实现我的网站登录。我基本上是从Django的书中复制并粘贴了以下内容。但是,在提交注册表时,我仍然收到一个错误(CSRF验证失败。请求被中止)。有人能告诉我是什么引起了这个错误以及如何修复它吗 这是我的密码: views.py: # Create your views here. from django import forms from django.contrib.auth.forms import UserCreationForm from django.http import Htt

我想实现我的网站登录。我基本上是从Django的书中复制并粘贴了以下内容。但是,在提交注册表时,我仍然收到一个错误(CSRF验证失败。请求被中止)。有人能告诉我是什么引起了这个错误以及如何修复它吗

这是我的密码:

views.py:

# Create your views here.
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

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("registration/register.html", {
        'form': form,
    })
register.html:

<html>
<body>

{% 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 %}
</body>
</html>

{%block title%}创建帐户{%endblock%}
{%block content%}
创建帐户
{%csrf_令牌%}
{{form.as_p}}
{%endblock%}
您需要将
csrf(请求)
添加到您的上下文中

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.context_processors import csrf

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()
    con = {'form': form}
    con.update(csrf(request))
    return render_to_response("registration/register.html", con)

为此,您可能需要将您的上下文转换为
上下文
对象,而不是
dict
,但原则是正确的。

假设您使用的是Django 1.2.x,只需在
{form.as\p}
之前添加以下内容:

{%csrf\u令牌%}


如果不想将
{%csrf\u token%}
添加到每个表单中,请查看将这两个中间件添加到设置文件以了解原因

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

我遇到了完全相同的问题——蓝辣椒的回答让我走上了正确的轨道。将RequestContext添加到表单视图可以解决此问题

from django.template import RequestContext
以及:


这为我解决了问题。

我在使用Django 1.2.3时,出现了一些间歇性问题:

要做的事情:

确保模板中存在csrf令牌

<form action="" method="post">{% csrf_token %}
return render_to_response('search-results.html', {'results' : results}, context_instance=RequestContext(request) )
如果GET由相同的视图函数处理,请确保您也为GET使用RequestContext,并呈现相同的模板

i、 e:

不是:

确保“django.middleware.csrf.CsrfViewMiddleware”列在您的设置中。py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
稍后回答

现在
render
可以使用而不是
context\u instance=RequestContext(request)


如果要使用{%csrf_token%},请尝试从settings.py的中间件列表中删除以下行:

'django.middleware.csrf.CsrfViewMiddleware',

为我工作……

@stevejalim讽刺地说,它仍然可以为1.2工作,但它被弃用了;user433033解决方案是必需的。对于当前的django,更好的解决方案是使用render()而不是render_to_response()。
if request.method == 'GET':
    ...
    return render_to_response('search-results.html', {'results':results})
elif request.method == 'POST':
    ...
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request))
MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
from django.shortcuts import render
return render(request, "registration/register.html", {
        'form': form,
    })
'django.middleware.csrf.CsrfViewMiddleware',