2011-11-30 25 views
14

El error está en la localización http://127.0.0.1:8000/fileupload/form.pyDjango: CSRF token de falta o incorrecta

Tengo la versión 1.3 de Django. He intentado especificar localhost: 8000 como se indica en la pregunta de otra persona, pero esto no funcionó para mí. Estoy tratando de tener un formulario de carga de archivos, pero recibo un error que form.py no tiene el token 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 %} 

Estoy muy confundido por favor dígame algunas cosas para probar. Gracias

Respuesta

29

Tiene que pasar RequestContext en render_to_response para csrf_token

Por esta: (views.py)

from django.template import RequestContext 

... 

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

Esto pasa el testigo de csrf a la plantilla.

+0

Ya tiene usó '{% csrf_token%}' en su plantilla, así que esto debería funcionar. –

+0

con la adición de RequestContext obtengo un error de tipo __init __() obtuve un argumento de palabra clave inesperado 'context_instance' – user1072646

+0

Gracias, acabo de descifrarlo. Estaba agregando RequestContext (solicitud) como dijiste y quitando c y context_instance = de la instrucción if. Si cambias tu respuesta para incluirla, la marcaré correctamente. – user1072646

0

Mi respuesta es similar a la respuesta de @Yugal Jindle anterior.

estoy usando Django 1.10 y tuve un problema similar, que trabajó para mí después de editar

return render_to_response(param1, param2) 

a

return render(request, param1, param2) 

P. S. Asegúrate de que tienes la línea de abajo en su variable de MIDDLEWARE en el settings.py

'django.middleware.csrf.CsrfViewMiddleware' 
0

También puede ocurrir si utiliza @cache_page(60 * 15) decoradores. Si almacena en caché una página con un formulario que contiene un token CSRF, solo almacenará en caché el token CSRF del primer usuario. Por lo tanto, es un poco difícil de depurar a veces.

Más información de Django documentation

Si la etiqueta csrf_token plantilla es utilizado por una plantilla (o la función get_token se llama de otra manera), CsrfViewMiddleware añadirá una cookie y a Varía: encabezado de Cookie a la respuesta. Esto significa que el middleware funcionará bien con el middleware de caché si se usa como instruido (UpdateCacheMiddleware va antes que cualquier otro middleware).

Sin embargo, si se utiliza decoradores de caché en las opiniones individuales, el middleware CSRF será todavía no han sido capaces de establecer la cabecera Vary o la cookie de CSRF , y la respuesta será almacenado en caché sin ninguno de ellos.En este caso, en cualquier punto de vista que requerirán un token CSRF que se insertará se debe utilizar el django.views.decorators.csrf.csrf_protect() decorador de primera:

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