2017-10-03 6 views
0

Je commence tout juste à implémenter une requête post sur mon projet mais j'ai des problèmes avec le jeton csrf.La vérification CSRF a échoué. Demande annulée Django 1.9

Même si elle semble je l'ai utilisé correctement (j'utiliser rendu, ont biscuit permettre, {% csrf_token%} est dans le code html et j'ai le middleware dans les paramètres de django)

Edit: vue. py:

def mouvementCreation(request): 
    idMI = 0 
    especes = TbEspece.objects.order_by('id') 
    #Get Mouvement informations 

    #Connection to 'erp-site' DB 
    cursor = connections['erp-site'].cursor() 
    try: 
     #Get Produits list from Espece 
     query = "{CALL SP_webGET_PRODUIT_FROM_ESPECE(%s,%s,%s,%s,%s)}" 
     arguments = (2016, 'C', 0, 10, 'A',) 
     cursor.execute(query, arguments) 
     produits = dictfetchall(cursor) 

     #Get Transporters list 
     cursor.execute("{CALL SP_webGET_TRANSPORT}") 
     transporters = dictfetchall(cursor) 

     #Get Livreur list 
     cursor.execute("{CALL SP_webGET_LIVREUR}") 
     livreurs = dictfetchall(cursor) 
    finally: 
     cursor.close()  

    cursor = connections['site'].cursor() 
    try: 
     #Get Circuit list 
     cursor.execute("{CALL SP_webGET_CIRCUIT_FOR_MVT}") 
     circuits = dictfetchall(cursor) 

     #Get Source list 
     cursor.execute("{CALL SP_webGET_SOURCE_FOR_MVT}") 
     mvtsources = dictfetchall(cursor) 

     #Get Dest list 
     cursor.execute("{CALL SP_webGET_DEST_FOR_MVT}") 
     destinations = dictfetchall(cursor) 

     #Get PontBascule list 
     cursor.execute("{CALL SP_webGET_PBASCULE}") 
     pontBascules = dictfetchall(cursor) 
    finally: 
     cursor.close() 

    reg_normes = TbRegauxnormes.objects.all() 
    ordreexecs = TbOrdreexecution.objects.all() 
    form = mouvementForm(request.POST or None) 
    if form.is_valid(): 
     pont = form.cleaned_data['pont'] 
     dateheure = form.cleaned_data['dateheure'] 
     poid = form.cleaned_data['poid'] 
     dsd = form.cleaned_data['dsd'] 
     typepesee = form.cleaned_data['typepesee'] 
     #Connection to 'erp-site' DB 
     cursor = connections['pontbascule'].cursor() 
     try: 
      #Get Produits list from Espece 
      query = "{CALL SP_ADD_MANUAL_PESEE(%s,%s,%s,%s,%s, %s,%s,%s,%s,%s, %s,%s,%s,%s,%s, %s,%s,%s,%s,%s, %s,%s,%s)}" 
      arguments = (pont, 'TICKETCHEAT', dateheure, poid, dsd,typepesee, '','','','','','','','','','','','','','','','','') 
      cursor.execute(query, arguments) 
     finally: 
      cursor.close() 
    return render(request, 'mouvementCreation.html', {'form': form, 'especes' : especes, 'produits' : produits, 'transporters' : transporters, 'livreurs' : livreurs, 'circuits' : circuits, 'mvtsources' : mvtsources, 'destinations' : destinations, 'pontBascules' : pontBascules}) 
modèle

:

<form name="Form1" method="post" action="" enctype="text/plain" id="Form1"> 
{% csrf_token %} 
<input type="text" id="Editbox9" style="position:absolute;left:87px;top:46px;width:86px;height:16px;line-height:16px;z-index:173;" name="pont" value="" spellcheck="false"> 
<input type="text" id="Editbox34" style="position:absolute;left:87px;top:80px;width:86px;height:16px;line-height:16px;z-index:174;" name="dateheure" value="" spellcheck="false"> 
<input type="text" id="Editbox35" style="position:absolute;left:87px;top:114px;width:87px;height:16px;line-height:16px;z-index:175;" name="poid" value="" spellcheck="false"> 
<input type="text" id="Editbox36" style="position:absolute;left:88px;top:153px;width:84px;height:16px;line-height:16px;z-index:176;" name="dsd" value="" spellcheck="false"> 
<input type="text" id="Editbox37" style="position:absolute;left:87px;top:187px;width:86px;height:16px;line-height:16px;z-index:177;" name="typepesee" value="" spellcheck="false"> 
<input type="submit" id="Button14" name="submit" value="Submit" style="position:absolute;left:361px;top:65px;width:96px;height:25px;z-index:178;"> 
</form> 

paramètres Middleware:

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

J'ai cherché sur plusieurs post et essayé beaucoup de correctif mais jusqu'ici rien n'a fonctionné et je reçois toujours "Raison donnée pour l'échec: Jeton de CSRF manquant ou incorrect."

+0

Utilisez-vous la même vue 'mouvementCreation' pour afficher le formulaire et traiter les données publiées? Est-ce que le jeton apparaît dans le html rendu (voir la source dans votre navigateur pour vérifier)? – Alasdair

+0

Le jeton apparaît lorsque je vérifie la source dans mon navigateur oui. Et oui, idéalement, ce que je veux faire ici, c'est obtenir les informations du formulaire dans la vue, puis appeler une procédure stockée dans ma BD pour créer une nouvelle entrée –

+0

Ah, je pense que le problème est 'enctype =" text/plain "'. Voir [cette question] (https://stackoverflow.com/questions/44526457/csrf-token-missing-or-incorrect-even-after-including-the-token-tag). – Alasdair

Répondre

0

Vous devez transmettre le contexte de la requête au modèle.

+0

Que voulez-vous dire? –

+0

Au départ, je pensais que c'était le problème. Mais vous utilisez render(). Render a un contexte de requête intégré passé. Cette réponse n'est pas correcte. Pourquoi passez-vous les locaux()? au lieu de locaux, pouvez-vous passer l'instance de formulaire et d'autres contextes comme dict? –

+0

J'utilise les locaux parce que cela a été utilisé dans le tutoriel que je suivais sur les formulaires comment passez-vous l'instance de formulaire? –

0

Ajouter à votre views.py

@method_decorator(csrf_exempt) 
def dispatch(self, request, *args, **kwargs): 
    return super(GetOrderCount, self).dispatch(request, *args, **kwargs) 
+0

Si je ne sais pas comment le rendre capable de résoudre @method_decorator ou GetOrderCount, Django ne semble pas connaître ces appels –

+0

Getordercounts devrait être le nom de votre classe. Et l'importation de django.core.context_processors importer csrf – Taniya

+0

il semble fonctionner pour la partie de la classe, mais l'importation n'est pas utilisée, ne devrait-il pas être (csrf) au lieu de (csrf_exempt)? –

0

Je fixe temporairement le problème, je devais commenter « # « django.middleware.csrf.CsrfViewMiddleware », » semble bizarre d'avoir à le faire dans ordonner au csrf de fonctionner mais au moins cela fonctionne.

+0

Ce n'est pas une solution idéale. En commentant 'CsrfViewMiddleware' vous désactivez la protection CSRF pour l'ensemble de votre site. – Alasdair

+0

Je comprends cela, mais au moins je peux contourner le problème pendant que je trouve une solution, avez-vous une idée de ce qui pourrait causer cela. –