2012-02-12 25 views
7

mój views.py:Django nie csrf_token drukowania ukryte pole wejściowe

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

w moim szablonu 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> 

więc kiedy otworzyć stronę w przeglądarce i zobaczyć kod źródłowy i nie ma csrf żeton !

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

Czego mi brakowało?

UPDATE: this pomogło.

Odpowiedz

8

Trzeba użyć RequestContext aby korzystać 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: Zastosowanie csrf_protect dekorator nie jest zalecane, ponieważ jeśli zapomnisz go używać, trzeba będzie lukę bezpieczeństwa.

+0

Dzięki, to doprowadzało mnie do szału. Cieszę się, że było to coś prostego. – Cerin

1

Gdy jesteś na 1.3 (co powinno być), skrót render oferuje bardziej zwarty sposób to zrobić:

from django.shortcuts import render 

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

proszę zobaczyć fragment z dokumentu Django.

Metoda dekoratora Zamiast dodawać CsrfViewMiddleware jako ochronę zbiorczą, można użyć dekoratora csrf_protect, który ma dokładnie taką samą funkcjonalność, w konkretnych widokach, które wymagają ochrony. Należy go używać zarówno w widokach, które wstawiają token CSRF w danych wyjściowych, jak i tych, które akceptują dane formularza POST. (Często są to te same funkcje widoku, ale nie zawsze). Stosuje się go tak:

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

Zastosowanie dekorator nie jest zalecane przez siebie, ponieważ jeśli zapomnisz go używać, trzeba będzie lukę bezpieczeństwa. Strategia używania obu pasów jest w porządku i poniesie minimalny narzut.