2017-09-29 11 views
0

Les requêtes POST à ​​la vue Django ci-dessous entraînent l'échec de la vérification CSRF (403). J'ai confirmé que le jeton csrf caché est rendu dans la source de la page. Je suis également capable de faire des demandes POST sans erreurs dans d'autres vues. Je ne sais pas comment déboguer davantage.Echec de la vérification CSRF de Django même avec {% csrf_token%}

views.py:

def email(request): 
    if request.method == 'POST': 
     email = request.POST['email'] 
     fd = open('emaildb.csv','a') 
     fd.write(email+',somefile\n') 
     fd.close() 
     return render(request, 'receipts/email.html', {'text':'Thanks, we''ll get back to you soon.'}) 
    else: 
     return render(request, 'receipts/email.html',) 

email.html:

<form action="email" method="post" enctype="text/plain"> 
    {% csrf_token %} 
    E-mail:<br> 
    <input type="text" name="email"> 
    <input type="submit" value="Send"> 
</form> 
+2

Que diriez-vous de retirer la 'enctype = "text/plain"' et essayer à nouveau? Essayez aussi de ne pas utiliser 'action =" email "' et utilisez à la place 'action =" {% url 'name_of_url'%} "' ou si vous POSTez dans la même vue, vous pouvez omettre le 'action =" email "' tout à fait. –

+0

Cela ne signifie pas que vous avez un jeton valide, même si vous le voyez dans la source de la page. Il pourrait être expiré un aussi. –

+1

nik_m est correct, en supprimant simplement l'enctype = "text/plain" a résolu le problème. – Feyman81

Répondre

0

U ne peut pas appeler la méthode comme

<form action="email" method="post" enctype="text/plain"> 
    {% csrf_token %} 
    E-mail:<br> 
    <input type="text" name="email"> 
    <input type="submit" value="Send"> 
</form> 

dans votre urls.py vous devez écrire

url(r'^email/$', views.email, name='email') 

et appeler cette méthode en utilisant le formulaire comme

<form action="{% url 'your_folder_name_where_located_your_urls.py:email'%}" method="post" enctype="text/plain"> 
    {% csrf_token %} 
    E-mail:<br> 
    <input type="text" name="email"> 
    <input type="submit" value="Send"> 
</form>