10

ログインフォームのアプリを作成していますが、アプリを実行しているときにログインボタンをクリックすると、次のエラーが発生します

禁止 (403) CSRF 検証に失敗しました。リクエストは中止されました。

view.py のコードは次のとおりです。

from django.template import  loader
from django.shortcuts import render_to_response
from registration.models import Registration
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import redirect


def view_login(request,registration_id):
   t = loader.get_template('registration/login.html') 
   try:
         registration=Registration.objects.get(pk=registration_id)
   except Registration.DoesNotExist:
         return render_to_response("login.html",{"registration_id":registration_id})

def home(request,registration_id):
    if request.method == "POST":
      username = request.POST.get('user_name')
      password = request.POST.get('password')
      user = authenticate(username=username, password=password)
      if user is not None:
        if user.is_active:
          login(request, user)
        # success
          return render('registration/main_page.html',{'registration_id':registration_id},context_instance=RequestContext(user))
        else:
         #user was not active
           return redirect('q/',context_instance=RequestContext(user))
      else:
        # not a valid user
           return redirect('q/',context_instance=RequestContext(user))
    else:
       # URL was accessed directly
           return redirect('q/',context_instance=RequestContext(user))
4

6 に答える 6

17

{% csrf_token %}フォームに追加する必要があります

https://docs.djangoproject.com/en/2.2/ref/csrf/

そのように:

<form>
    {% csrf_token %}
    <anything_else>
</form>

また、使用するたびに RequestContext(request) を使用する必要がありますrender_to_response:

return render_to_response("login.html",
    {"registration_id":registration_id},
    context_instance=RequestContext(request))

そして、 authenticate と login をインポートする必要があります:

from django.contrib.auth import authenticate, login
于 2012-08-29T08:51:45.833 に答える
2

バージョン 1.1 が使用されている本「The Definitive Guide to Django」を使用しているときに、この問題に遭遇しました。この本は、後のバージョンで義務付けられている csrf_token 検証の必要性に対処していません。

この問題を修正するには、次を追加します。

from django.template import RequestContext

views.py ファイルに追加し、これにより render_to_response 関数の引数が追加されました。

context_instance = RequestContext(request)

テンプレートのタグ{% csrf_token %}内に必ず追加してください<form>

于 2012-11-05T20:42:49.483 に答える
2

コメントするだけ 'django.middleware.csrf.CsrfViewMiddleware'

私のために働くあなたのsettings.pyで:

//settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CSRF を別の方法で管理しない限り、これにはセキュリティ上の欠陥がある可能性があり、CSRF 攻撃を受けやすいため、お勧めしません。

于 2016-08-30T04:00:43.937 に答える