wake-up-neo.com

Django: CSRF-Token fehlt oder ist falsch

Der Fehler befindet sich am Speicherort http://127.0.0.1:8000/fileupload/form.py

Ich habe Version 1.3 von Django. Ich habe versucht, localhost: 8000 anzugeben, wie in der Frage eines anderen angegeben, aber das hat für mich nicht funktioniert. Ich versuche, ein Datei-Upload-Formular zu haben, erhalte jedoch die Fehlermeldung, dass form.py kein CSRF-Token hat.

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 %}

Ich bin sehr überrascht, bitte erzähl mir ein paar Dinge, die du ausprobieren solltest. Danke dir

14
user1072646

Sie müssen RequestContext in render_to_response für csrf_token übergeben.

Dazu: ( views.py )

from Django.template import RequestContext

...

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

Dies übergibt das Token für csrf an die Vorlage.

30
Yugal Jindle

Meine Antwort ähnelt der obigen Antwort von @Yugal Jindle.

Ich verwende Django 1.10 und hatte ein ähnliches Problem, das nach der Bearbeitung für mich funktionierte 

return render_to_response(param1, param2)

zu

return render(request, param1, param2)

P.S. Stellen Sie sicher, dass sich in der MIDDLEWARE-Variablen in der Datei settings.py die folgende Zeile befindet 

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

Es kann auch vorkommen, wenn Sie @cache_page(60 * 15) Dekoratoren verwenden. Wenn Sie eine Seite mit einem Formular zwischenspeichern, das ein CSRF-Token enthält, wird nur das CSRF-Token des ersten Benutzers zwischengespeichert. Daher ist es manchmal schwierig, zu debuggen.

Weitere Infos aus Django Dokumentation

Wenn das Vorlagen-Tag csrf_token von einer Vorlage verwendet wird (oder die Funktion get_token Auf eine andere Weise aufgerufen wird), fügt CsrfViewMiddleware eine .__ hinzu. Cookie und ein Vary: Cookie -Header zur Antwort. Dies bedeutet, dass die Middleware spielt gut mit der Cache-Middleware, wenn sie als .__ verwendet wird. angewiesen (UpdateCacheMiddleware steht vor allen anderen Middleware).

Wenn Sie jedoch Cache-Dekoratoren für einzelne Ansichten verwenden, wird der CSRF Die Middleware konnte den Vary-Header oder die .__ noch nicht setzen. CSRF-Cookie, und die Antwort wird ohne eines gespeichert. Im In diesem Fall für alle Ansichten, für die ein CSRF-Token eingefügt werden muss Sie sollten die Django.views.decorators.csrf.csrf_protect () .__ verwenden. Dekorateur zuerst:

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