2011-01-23 15 views
8

Django 1.2 liên tục cung cấp cho tôi lỗi xác minh CSRF này khi tôi thực hiện biểu mẫu POST. Tôi "nghĩ" Tôi đã làm tất cả những điều hỏi trong Django 1.2 tài liệu, cụ thể là,Django 1.2.4 Xác minh CSRF không thành công

  1. Đảm bảo MIDDLEWARE_CLASSES được bao gồm với 'django.middleware.csrf.CsrfViewMiddleware'

  2. Đảm bảo {% csrf_token%}

    <form action="/words/new/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
        <input type="submit" value="Enter" /> 
    </form> 
    
  3. Sử dụng RequestContext trong phản ứng của tôi

    def create(request): 
        if request.method == 'POST': 
         form = DefinitionForm(request.POST) 
         if form.is_valid(): 
          form.save() 
         c = {} 
         return render_to_response('dict/thanks.html',c, 
                context_instance=RequestContext(request)) 
        else: 
         form = DefinitionForm() 
        return render_to_response('dict/create_definition.html', { 
         'form' : form, 
        }) 
    

Lưu ý rằng hành động GET hoạt động trong chức năng này. Vì vậy, tôi nghĩ rằng tôi đang sử dụng render_to_response đúng.

Tôi thậm chí đã cố gắng ném vào trang trí @csrf_protect và thậm chí điều đó dường như không hoạt động. Tôi hết ý tưởng và tôi sắp bị nghẹt thở với máy tính xách tay của mình.

Mọi thứ bạn có thể nghĩ đến?

Cảm ơn!

+0

Kiểm tra HTML trong trình duyệt của bạn để đảm bảo trường mã thông báo csrf có trong đó. Sau đó đổ các câu trả lời POST để kiểm tra nó được trở lại xem. – Spacedman

Trả lời

7

Bạn hiện không theo dõi # 3. Các RequestContext phải được sử dụng với kết xuất của mẫu cho thấy các hình thức. Nó không cần thiết cho trang cảm ơn.

return render_to_response('dict/create_definition.html', { 
    'form' : form, 
}, context_instance=RequestContext(request)) 

Và như một lưu ý phụ, bạn nên sử dụng PRG pattern thay vì hiển thị trực tiếp trang cảm ơn.

+0

Đó là cho hành động GET. Nếu bạn nhìn vào mã một lần nữa, tôi đã bao gồm điều đó cho điều kiện khi request.method == 'POST'. – Bryan

+3

@bryli: Chính xác đó là vấn đề. Bộ xử lý ngữ cảnh CSRF cần bối cảnh yêu cầu khi tạo mã thông báo và đặt nó trong ngữ cảnh mẫu, (có thể) không phải khi kiểm tra nó trong POST. – AndiDog

+0

Giúp tôi, cảm ơn! – Chris