0

こんにちは私はdjangoを使用して一部のユーザーを登録しようとしている初心者です。DjangoBookを読んでいて、登録に関する章を読んでいます。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クラスを使用しない-ContextをRequestContextに置き換えます

このような

from django.template import RequestContext

およびrenderステートメントで

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 に答える