2012-08-29 62 views
6

Tôi đang làm cho một ứng dụng hình thức đăng nhập nhưng khi tôi chạy ứng dụng của tôi và click vào nút đăng nhập các lỗi sau đây sẽ xảy raBị cấm (403) Xác minh CSRF không thành công. Yêu cầu hủy bỏ

Forbidden (403) xác minh CSRF thất bại. Yêu cầu bị hủy.

mã của view.py là như:

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

Trả lời

16

Bạn cần phải thêm {% csrf_token %} trong mẫu của bạn

https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/

như thế:

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

Ngoài ra, bạn phải sử dụng RequestContext (yêu cầu) đêm trước rytime bạn sử dụng render_to_response:

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

Và bạn phải nhập khẩu xác thực và đăng nhập:

from django.contrib.auth import authenticate, login 
+0

trong ** home.html ** hoặc ** login.html ** hoặc ** cả ** – user786

+0

Nó phụ thuộc, nơi là mẫu của bạn? – BlueMagma

+0

ok, tôi đã thêm nó nhưng vẫn nhận được lỗi. Wheather tôi phải nhập somethong ??? – user786

2

tôi gặp phải vấn đề này khi sử dụng cuốn sách "The Definitive Guide để Django", trong đó phiên bản 1.1 được sử dụng. Cuốn sách không giải quyết nhu cầu xác minh csrf_token được yêu cầu trong các phiên bản sau.

Để khắc phục vấn đề này, thêm:

from django.template import RequestContext 

đến tập tin views.py và lập luận này gia tăng đối với các chức năng render_to_response:

context_instance = RequestContext(request) 

Hãy chắc chắn để thêm {% csrf_token %} trong <form> thẻ trong mẫu

3

Chỉ cần nhận xét 'django.middleware.csrf.CsrfViewMiddleware'

trong bạn settings.py, mà làm việc cho tôi:

//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', 
] 
Các vấn đề liên quan