2012-02-12 22 views
7

tôi views.py:django csrf_token không in trường nhập ẩn

from django.core.context_processors import csrf 
from django.views.decorators.csrf import csrf_protect 
from django.http import * 
from django.template import * 
from django.shortcuts import * 
# Create your views here. 
@csrf_protect 
def homepage(request): 
     return render_to_response('index.html', {'files':os.listdir('/home/username/public_html/posters') }) 
@csrf_protect 
def upload(request): 
     return render_to_response('list.html',) 

trong mẫu của tôi index.html:

<html> 
<body> 
<h1> All uploaded posters: </h1> 
<form action='/posters/upload' method= 'POST'>{%csrf_token%} 
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload"> 
</form> 
{%for file in files %} 
<a href = 'http://servername/~username/posters/{{file}}'>{{file}}</a> <br /> 
{%endfor%} 
</body> 
</html> 

nên khi tôi mở trang web trong trình duyệt và xem mã nguồn và không có CSRF thẻ !

<html> 
<body> 
<h1> All uploaded posters: </h1> 
<form action='/posters/upload' method= 'POST'> 
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload"> 
</form> 

<a href= ...... 

Tôi đã bỏ lỡ điều gì?

CẬP NHẬT: this đã giúp.

Trả lời

8

Bạn cần phải sử dụng RequestContext để sử dụng CSRF middleware:

from django.template import RequestContext 

# In your view: 
return render_to_response('index.html' 
    {'files':os.listdir('/home/username/public_html/posters') }, 
    context_instance=RequestContext(request)) 

BTW: Sử dụng csrf_protect trang trí không được khuyến khích, vì nếu bạn quên sử dụng nó, bạn sẽ có một lỗ hổng bảo mật.

+0

Cảm ơn, điều này đã khiến tôi phát điên. Vui vì nó là một cái gì đó đơn giản. – Cerin

1

Khi bạn đang ở trên 1.3 (mà bạn nên có), các phím tắt render cung cấp một cách nhỏ gọn hơn để làm việc đó:

from django.shortcuts import render 

def some_view(request): 
    return render(request, 'template.html', context_dict) 
0

Xin xem đoạn mã từ tài liệu django.

Phương pháp trang trí Thay vì thêm CsrfViewMiddleware làm bảo vệ chăn, bạn có thể sử dụng trình trang trí csrf_protect, có chức năng giống hệt nhau, trên các chế độ xem cụ thể cần bảo vệ. Nó phải được sử dụng cả trên các chế độ xem chèn mã thông báo CSRF vào đầu ra và trên các mã chấp nhận dữ liệu biểu mẫu POST. (Đây thường là cùng một chức năng xem, nhưng không phải lúc nào). Nó được sử dụng như thế này:

from django.views.decorators.csrf import csrf_protect 
from django.template import RequestContext 

@csrf_protect 
def my_view(request): 
    c = {} 
    # ... 
    return render_to_response("a_template.html", c, 
           context_instance=RequestContext(request)) 

Sử dụng trang trí không được khuyến khích bởi chính nó, vì nếu bạn quên sử dụng nó, bạn sẽ có một lỗ hổng bảo mật. Chiến lược 'thắt lưng và niềng răng' của việc sử dụng cả hai đều tốt, và sẽ phải chịu chi phí tối thiểu.

Các vấn đề liên quan