代码之家  ›  专栏  ›  技术社区  ›  niklasfi Rahul Tripathi

django中的csrf错误

  •  14
  • niklasfi Rahul Tripathi  · 技术社区  · 16 年前

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

    这是我的密码:

    视图.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>
    
    7 回复  |  直到 16 年前
        1
  •  19
  •   Ícaro durdenk    7 年前

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

    from django.template import RequestContext
    

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

    这帮我修好了。

        2
  •  8
  •   Steven Keith    15 年前

    我在用 Django 1.2.3段 ,我有一些间歇性的问题:

    要做的事情:

    确保模板中存在csrf令牌 :

    <form action="" method="post">{% csrf_token %}
    

    使用RequestContext :

    return render_to_response('search-results.html', {'results' : results}, context_instance=RequestContext(request) )
    

    如果GET由同一个视图函数处理,请确保对GET也使用RequestContext,并呈现相同的模板。

    即:

    if request.method == 'GET':
        ...
        return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request) )
    elif request.method == 'POST':
        ...
        return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request))
    

    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))
    

    确保settings.py中列出了“django.middleware.csrf.CsrfViewMiddleware”

    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',
    )
    
        3
  •  6
  •   Steve Jalim    16 年前

    假设您使用的是django1.2.x,只需在之前添加这个 {{form.as_p}} :

    {% csrf_token %}

    CSRF docs

        4
  •  2
  •   Blue Peppers    16 年前

    csrf(request) 根据你的情况。

    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)
    

    您可能需要将上下文转换为 Context 对象,而不是 dict

        5
  •  1
  •   user225852 user225852    16 年前

    {% csrf_token %} 每一张表格。

    MIDDLEWARE_CLASSES = (
        #...
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.csrf.CsrfResponseMiddleware',
    )
    
        6
  •  1
  •   itzMEonTV    11 年前

    现在 render context_instance=RequestContext(request)

    from django.shortcuts import render
    return render(request, "registration/register.html", {
            'form': form,
        })
    
        7
  •  1
  •   Suraj Jha    7 年前

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

    'django.middleware.csrf.CsrfViewMiddleware',
    

    为我工作。。。。。。