2017-03-21 1 views
0

Je suis nouveau sur django, j'envoie un formulaire de mon fichier index.html (modèle de la 1ère application) aux vues de l'application (autre application). pyJeton CSRF manquant ou incorrect, lors de l'envoi de la demande à travers 2 applications différentes

index.html - app01/templates

<!DOCTYPE html> 
<html> 
<head> 
    <title>hello</title> 

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 


    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> 

<style type="text/css"> 
    body{ 
     background-color: 'lightblue'; 
    } 
</style> 
</head> 

<body> 
<nav class="navbar navbar-inverse bg-faded"> 
<a class="navbar-brand" href="#about"> 
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Cyno_Small_Logo_(Aug._2015).png/240px-Cyno_Small_Logo_(Aug._2015).png" width="30" height="30" > 

</a> 
<div class="col-md-2 bg-warning"><h3>Quizapp</h3></div> 

<div class="container off col-md-offset-2"> 
    <ul class="nav nav-tabs"> 
     <li><a data-toggle="tab" href="#regtab">New User? Register here!</a></li> 
     <li><a data-toggle="tab" href="#logtab">Already have an account? Login!</a></li> 
    </ul> 
</nav> 
    <div class="tab-content"> 
     <div id="regtab" class="tab-pane fade text-primary"> 


    {% csrf_token %} 

     {{ rform }} 



    <button id="rbtn" type="button" class="btn btn-primary btn-lg ">Register!</button> 
     </div> 
     <div id="logtab" class="tab-pane fade text-success" data- loading-text="Registering"> 

    {% csrf_token %} 

     {{ lform.as_p }} 



     <button id="lbtn" type="button" class="btn btn-primary btn-lg   " data-loading-text="Logging in" >Login!</button> 
     </div> 
    </div> 
</div> 




<script type="text/javascript"> 

$('#rbtn').click(function(){ 
    var form_data = { 
     'username' : $('#id_username').val(), 
     'password' : $('#id_password').val(), 
     'name' : $('#id_name').val() 
    } 
    $.post('/register_data/',form_data,function (data, status){ 
     var dt = JSON.parse(data); 
     var reg_status = dt.data.status; 
     if(reg_status == 'success'){ 
      alert("registered! click Ok to go to home"); 
      window.location = '/'; 
     } 
     else{ 
      alert("check form bro!"); 
     } 

    }); 
}); 

</script> 
</body> 

</html> 

views.py - comptes

from django.shortcuts import render,redirect  
from django.http import HttpResponse 
from django.views.decorators.csrf import csrf_exempt  
from app01.models import LoginForm,RegisterForm 
from django.contrib.auth import authenticate, login, logout 
from django.contrib.auth.decorators import login_required 
import json 
@csrf_exempt 
def register_data(request): 
    resp = { 
     'status': '' 
    } 

    if not request.method == 'POST': 
     resp['status'] = 'post req pls' 
     return HttpResponse(json.dumps({'data': resp})) 

    frm = RegisterForm(request.POST) 

    if frm.is_valid(): 

     uname = frm.cleaned_data['username'] 
     ps = frm.cleaned_data['password'] 
     name = frm.cleaned_data['name'] 
     try: 
      usr= User(username=uname) 
      usr.set_password(ps) 
      usr.save() 


     except: 
      resps['status']='user already exists' 
      return HttpResponse(json.dumps({'data':resp})) 

     myusr = MyUser(user=usr,name=name) 
     myusr.save() 
     return redirect('/') 
     resp['status'] = 'success' 
     return HttpResponse(json.dumps({'data':resp})) 

Chaque fois que je clique sur le bouton d'enregistrement, le terminal retourne 403 erreur interdite, CSRF jeton manquant ou inco Rect. J'ai déjà inclus {% csrf_token%} avant le formulaire et aussi @csrf_exempt avant la fonction.

Le code est encore en cours de développement (fonction de connexion encore à faire), je suis coincé jusqu'à ce que cette page de registre envoie une demande à la views.py/register_data

Répondre

1

Vous devez rendre vos formulaires dans les balises de formulaire. Voir la docs: https://docs.djangoproject.com/en/1.10/topics/forms/#the-template

<form> 
    {% csrf_token %} 
    {{ rform }} 
</form> 
<form> 
    {% csrf_token %} 
    {{ lform.as_p }} 
</form> 
+0

J'ai ajouté des balises de forme en dehors des deux formes, son montrant encore cette erreur dans la console: jquery.min.js: 4 POST http: // localhost: 8000/register_data/403 (Interdit) et ceci dans le terminal: Interdit (jeton CSRF manquant ou incorrect.):/Register_data/ [22/mars/2017 13:42:04] "POST/register_data/HTTP/1.1" 403 2502 – nimish666

+0

Désolé, je n'ai pas Ne remarquez pas que vous utilisiez jQuery pour POSTER les données. Vous devrez également envoyer le jeton CSRF dans votre charge POST avec le nom 'csrfmiddlewaretoken'. –

+0

Où devrais-je l'ajouter et comment? Y a-t-il une documentation à laquelle je peux me référer? merci pour la réponse rapide btw – nimish666