web-dev-qa-db-fra.com

Django: jeton CSRF manquant ou incorrect

L'erreur est à l'emplacement http://127.0.0.1:8000/fileupload/form.py

J'ai la version 1.3 de Django. J'ai essayé de spécifier localhost: 8000 comme indiqué dans la question de quelqu'un d'autre, mais cela n'a pas fonctionné pour moi. J'essaie d'avoir un formulaire de téléchargement de fichier mais je reçois une erreur indiquant que form.py ne possède pas le jeton 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 %}

Je suis très perplexe s'il vous plaît dites-moi quelques choses à essayer. Je vous remercie

14
user1072646

Vous devez passer RequestContext dans render_to_response pour csrf_token

Pour cela: ( views.py )

from Django.template import RequestContext

...

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

Cela transmet le jeton pour csrf au modèle.

30
Yugal Jindle

Ma réponse est similaire à celle de @Yugal Jindle ci-dessus.

J'utilise Django 1.10 et j'ai eu un problème similaire, cela a fonctionné pour moi après l'édition 

return render_to_response(param1, param2)

à

return render(request, param1, param2)

P.S. Assurez-vous d'avoir la ligne ci-dessous dans votre variable MIDDLEWARE dans le fichier settings.py 

'Django.middleware.csrf.CsrfViewMiddleware'
1
Mr.A

Cela peut également arriver si vous utilisez des décorateurs @cache_page(60 * 15). Si vous mettez en cache une page avec un formulaire contenant un jeton CSRF, vous mettrez en cache le jeton CSRF du premier utilisateur uniquement. Il est donc parfois difficile de déboguer.

Plus d'infos sur Documentation Django

Si la balise de modèle csrf_token est utilisée par un modèle (ou si la fonction get_token Est appelée autrement), CsrfViewMiddleware ajoute un. cookie et un en-tête Vary: Cookie à la réponse. Cela signifie que le le middleware jouera bien avec le middleware de cache s'il est utilisé comme demandé (UpdateCacheMiddleware passe avant tout autre middleware).

Toutefois, si vous utilisez des décorateurs de cache sur des vues individuelles, le fichier CSRF le middleware n'aura pas encore été en mesure de définir l'en-tête Vary ou le Le cookie CSRF et la réponse seront mis en cache sans l’un ni l’autre Dans Dans ce cas, sur toutes les vues nécessitant l'insertion d'un jeton CSRF vous devriez utiliser Django.views.decorators.csrf.csrf_protect () décorateur d'abord:

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