2017-03-07 3 views
0

Ich habe ein anderes Problem durch die großen Upgrades, die ich zu einer Django-App (von 1,7 bis 1,10 und Django Rest Framework bis 3.5.4) gemacht habe. Es ist mir gelungen, einige andere Fehler zu beheben, die einen 500-Fehler auf der Anmeldeseite verursacht haben, aber ich habe immer noch ein Problem mit dem CSRF-Token. Diese Funktionalität funktionierte vor den Upgrades. Ich habe all die Dinge, die in dem Fehler erwähnt geprüft ausgelagert (I DEBUG = True), aber alle von ihnen in Ordnung scheinen, wie folgt:Django CSRF-Token fehlt in Anmeldeformular

In der Klasse „Company“ Ich habe die Anmeldemethode:

def signup(self, request): 
    if request.method == "GET": 
     form = SignupForm() 
    else: 
     form = SignupForm(request.POST) 

     if form.is_valid(): 
      company = form.save() 
      user = company.managers.all()[0] 
      user = authenticate(
       email=user.email, password=request.POST["password1"]) 
      if user is not None: 
       login(request, user) 
       return HttpResponseRedirect(reverse("bagdisken:index")) 

    return shortcuts.render_to_response("bagdisken/signup.html", 
             context=RequestContext(request, { 
              'form': form, 
             })) 

Ich hatte Probleme mit dem Kontext, causgin ein 500 Fehler, die ich durch Hinzufügen der Anfrage im Kontext behoben. Zurück war es so:

return shortcuts.render_to_response("bagdisken/signup.html", {'form': form}) 

Die CSRF-Token in der Ansicht vorhanden ist:

{% extends "admin/base_site.html"%} 
{% load form_utils %} 
{% block content_title%}{% endblock %} 
{% block breadcrumbs %}{% endblock %} 
{% block nav-global %}{% endblock %} 
{% block coltype %}twelve columns offset-by-two{% endblock %} 
{% block content%} 
    <form id="signup" action="#" method="POST" > 
     {% csrf_token %} 
      {{ form|render }} 
      <input type="submit" value="Submit" /> 
    </form> 
{% endblock %} 

Und die CsrfViewMiddleware ist auch in Einstellung:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'corsheaders.middleware.CorsMiddleware', 
# Uncomment the next line for simple clickjacking protection: 
# 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

noch, die versteckten Eingang für das csrf-Token fehlt. Wie kann ich das Problem beheben?

Antwort

3

Verwenden Sie nicht render_to_response, es ist veraltet. Die Anforderung wird nicht in der Antwort verfügbar gemacht, sodass der CSRF-Vorlagenkontextprozessor nicht funktioniert.

Verwenden Sie stattdessen die Verknüpfung render. Die Vorlage wird mit einer Anforderung gerendert, sodass das CSRF-Token funktioniert.

from django.shortcuts import render 

def signup(self, request): 
    ... 
    return render(request, "bagdisken/signup.html", {'form': form}) 
+0

Arbeitete wie ein Charme, danke! –