2012-02-12 9 views
7

mi views.py:Django no csrf_token impresión campo de entrada oculto

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

en mi plantilla 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> 

así que cuando abro la página en el navegador y ver el código fuente y no hay token CSRF !

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

¿Qué es lo que extrañé?

ACTUALIZACIÓN: this ayudó.

Respuesta

8

Es necesario utilizar RequestContext con el fin de utilizar middleware CSRF:

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

Por cierto: El uso de csrf_protect decorador no es recomendable, ya que si se olvida de usarlo, usted tendrá un agujero de seguridad.

+0

Gracias, esto me estaba volviendo loco. Me alegro de que haya sido algo simple. – Cerin

1

Una vez que está en 1.3 (que debe ser), el acceso directo render ofrece una forma más compacta de hacerlo:

from django.shortcuts import render 

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

Por favor ver el fragmento de documento de Django.

El método de decorador En lugar de agregar CsrfViewMiddleware como protección general, puede usar el decorador csrf_protect, que tiene exactamente la misma funcionalidad, en vistas particulares que necesitan la protección. Debe usarse tanto en las vistas que insertan el token CSRF en el resultado como en las que aceptan los datos del formulario POST. (Estas suelen ser la misma función de vista, pero no siempre). Se utiliza la siguiente manera:

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

El uso del decorador no se recomienda por sí mismo, ya que si se olvida de usarlo, usted tendrá un agujero de seguridad. La estrategia de "usar correas y abrazaderas" es buena e incurrirá en gastos generales mínimos.

Cuestiones relacionadas