2011-11-30 32 views
14

Lỗi tại địa điểm http://127.0.0.1:8000/fileupload/form.pyDjango: Mã thông báo CSRF bị thiếu hoặc không chính xác

Tôi có phiên bản 1.3 của django. Tôi đã cố gắng xác định localhost: 8000 như đã nêu trong câu hỏi của người khác nhưng điều này không làm việc cho tôi. Tôi đang cố gắng để có một hình thức tải lên tập tin nhưng tôi nhận được một lỗi rằng form.py không có mã thông báo CSRF.

form.py:

class UploadFileForm(forms.Form): 

    title = forms.CharField(max_length=50) 
    file = forms.FileField() 

views.py:

def upload_file(request): 

    c = {} 
    c.update(csrf(request)) 

    if (not request.user.is_authenticated()) or (request.user == None): 
     return HttpResponseRedirect("/?error=11") 


    if request.method == 'POST': 
     form = c['UploadFileForm'] = UploadFileForm(request.POST, request.FILES, c, context_instance=RequestContext(request)) 

     if c['UploadFileForm'].is_valid(): 
     handle_uploaded_file(request.FILES['file']) 
     return HttpResponseRedirect('/success/url/') 

    else: 
     form = c['UploadFileForm'] = UploadFileForm() 
    return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']}) 

upload.html:

{% block main_content %} 


    <form action="fileupload/form.py" enctype="multipart/form-data" method="POST"> 
    {% csrf_token %} 
    <table> 

     <tr><td>Title:</td><td><input type="text" name="title" /></td></tr> 
     <tr><td>File:</td><td><input type="file" name="file" /></td></tr> 
    </table> 
     <input type="submit" value="Submit" class = "float_right button_input" /> 

    </form> 

{% endblock main_content %} 

Tôi rất bối rối xin vui lòng cho tôi biết một số điều để thử. Cảm ơn

Trả lời

29

Bạn cần phải vượt qua RequestContext trong render_to_response cho csrf_token

Đối với điều này: (views.py)

from django.template import RequestContext 

... 

return render_to_response('fileupload/upload.html', {'form': c['UploadFileForm']}, RequestContext(request)) 
# Added RequestContext 

này vượt qua thẻ cho CSRF cho mẫu.

+0

Bạn có đã đã sử dụng '{% csrf_token%}' trong mẫu của bạn, vì vậy việc này sẽ hoạt động. –

+0

với việc bổ sung các RequestContext tôi nhận được một loại lỗi __init __() đã nhận được một đối số từ khóa bất ngờ 'context_instance' – user1072646

+0

Cảm ơn bạn, tôi chỉ figured it out. Nó đã được thêm RequestContext (yêu cầu) như bạn đã nói và loại bỏ c và context_instance = từ câu lệnh if. Nếu bạn thay đổi câu trả lời của bạn để bao gồm rằng tôi sẽ đánh dấu nó đúng. – user1072646

0

Câu trả lời của tôi giống với câu trả lời của @Yugal Jindle ở trên.

Tôi đang sử dụng Django 1,10 và tôi đã có một vấn đề tương tự, nó làm việc cho tôi sau khi chỉnh sửa

return render_to_response(param1, param2) 

để

return render(request, param1, param2) 

T.B. Hãy chắc chắn rằng bạn có dòng dưới đây trong biến Middleware của bạn trong settings.py

'django.middleware.csrf.CsrfViewMiddleware' 
0

Nó cũng có thể xảy ra nếu bạn sử dụng @cache_page(60 * 15) trang trí. Nếu bạn đệm một trang có biểu mẫu chứa mã thông báo CSRF, bạn sẽ lưu bộ nhớ cache CSRF của người dùng đầu tiên. Vì vậy, đôi khi rất khó để gỡ lỗi. Thông tin

Thêm từ Django documentation

Nếu thẻ csrf_token mẫu được sử dụng bởi một mẫu (hoặc chức năng get_token được gọi là một số cách khác), CsrfViewMiddleware sẽ thêm một cookie và a Thay đổi: Cookie tiêu đề để phản hồi. Điều này có nghĩa là phần mềm trung gian sẽ hoạt động tốt với phần mềm trung gian bộ nhớ cache nếu được sử dụng như hướng dẫn (UpdateCacheMiddleware trước tất cả các phần mềm trung gian khác).

Tuy nhiên, nếu bạn sử dụng bộ trang trí bộ đệm trong chế độ xem riêng lẻ, phần mềm trung gian CSRF sẽ không thể đặt tiêu đề Vary hoặc cookie CSRF và phản hồi sẽ được lưu vào bộ nhớ cache mà không có.Trong trường hợp này, trên bất kỳ quan điểm rằng sẽ đòi hỏi một CSRF token được chèn bạn nên sử dụng django.views.decorators.csrf.csrf_protect() trang trí đầu tiên:

from django.views.decorators.cache import cache_page 
from django.views.decorators.csrf import csrf_protect 

@cache_page(60 * 15) 
@csrf_protect 
def my_view(request): 
    ... 
Các vấn đề liên quan