python - forbidden - Django: token de CSRF faltante o incorrecto
csrf token django (3)
Debe pasar RequestContext
en render_to_response para csrf_token
Para esto: ( views.py )
from django.template import RequestContext
...
return render_to_response(''fileupload/upload.html'', {''form'': c[''UploadFileForm'']}, RequestContext(request))
# Added RequestContext
Esto pasa el token de csrf a la plantilla.
El error está en la ubicación http://127.0.0.1:8000/fileupload/form.py
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 perplejo por favor dime algunas cosas para probar. Gracias
Mi respuesta es similar a la respuesta de @Yugal Jindle anterior.
Estoy usando Django 1.10 y tuve un problema similar, funcionó para mí después de la edición
return render_to_response(param1, param2)
a
return render(request, param1, param2)
PD Asegúrese de tener la siguiente línea en su variable MIDDLEWARE en settings.py
''django.middleware.csrf.CsrfViewMiddleware''
También puede suceder si usa @cache_page(60 * 15)
. 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 la documentación de Django
Si una plantilla utiliza la etiqueta de plantilla csrf_token (o la función get_token se llama de otra manera), CsrfViewMiddleware agregará una cookie y un encabezado Vary: Cookie a la respuesta. Esto significa que el middleware funcionará bien con el middleware de caché si se usa según las instrucciones ( UpdateCacheMiddleware va antes que el otro middleware).
Sin embargo, si utiliza decoradores de caché en vistas individuales, el middleware CSRF aún no habrá podido establecer el encabezado Vary o la cookie CSRF, y la respuesta se almacenará en caché sin ninguno. En este caso, en cualquier vista que requiera insertar un token CSRF, primero debe usar el decorador django.views.decorators.csrf.csrf_protect () :
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): ...