2012-02-12 21 views
7

benim views.py baskı yapmadığı csrf_token !django gizli giriş alanını

<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= ...... 

Neyi özledim?

GÜNCELLEME: this yardımcı oldu.

cevap

8

Sen CSRF ortakatmanını kullanmak için RequestContext kullanmanız gerekir:

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: Kullanmaya unutursam, bir güvenlik deliği olacağından csrf_protect dekoratör kullanımı tavsiye edilmez.

from django.shortcuts import render 

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

Teşekkürler, bu beni deli ediyordu. Sevindim, basit bir şeydi. – Cerin

1

Eğer 1.3 üzerinde girdikten sonra (sen olmalıdır), render kısayol bunu yapmanın daha kompakt bir yol sunar.

Dekoratör metodu Bir battaniye koruması olarak CsrfViewMiddleware eklemek yerine, tam olarak aynı işlevselliğe sahip csrf_protect dekoratörünü, korumaya ihtiyaç duyan belirli görünümlerde kullanabilirsiniz. Hem çıkışta CSRF belirtecini ekleyen görünümlerde hem de POST form verisini kabul eden görünümlerde kullanılmalıdır. (Bunlar genellikle aynı görünüm işlevidir, ancak her zaman değil). Böyle kullanılır: Kullanmaya unutursam, bir güvenlik deliği olacağından dekoratör

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

Kullanım kendisi tarafından tavsiye edilmez. Her ikisini de kullanmanın 'kemer ve parantez' stratejisi iyidir ve asgari yükü aşacaktır.

0

Django belgeden pasajı bakın: