web-dev-qa-db-fra.com

La vérification CSRF a échoué. Demande abandonnée

J'essaie de créer un site Web très simple où l'on peut ajouter des données dans la base de données sqlite3. J'ai un formulaire POST avec deux entrées de texte.

index.html:

{% if top_list %}
    <ul>
    <b><pre>Name    Total steps</pre></b>
    {% for t in top_list %}
        <pre>{{t.name}} {{t.total_steps}}</pre>
    {% endfor %}
    </ul>
    {% else %}
    <p>No data available.</p>
{% endif %}
<br>
<form action="/steps_count/" method="post">
    {% csrf_token %}
    Name: <input type="text" name="Name" /><br />
    Steps: <input type="text" name="Steps" /><br />
   <input type="submit" value="Add" />
 </form>

forms.py:

from Django import forms
from steps_count.models import Top_List

class Top_List_Form(forms.ModelForm):
    class Meta:
        model=Top_List

views.py:

# Create your views here.
from Django.template import Context, loader
from Django.http import HttpResponse
from steps_count.models import Top_List
from steps_count.forms import Top_List_Form
from Django.template import RequestContext
from Django.shortcuts import get_object_or_404, render_to_response

def index(request):

if request.method == 'POST':
    #form = Top_List_Form(request.POST)
    print "Do something"
else:
    top_list = Top_List.objects.all().order_by('total_steps').reverse()
    t = loader.get_template('steps_count/index.html')
    c = Context({'top_list': top_list,})
    #output = ''.join([(t.name+'\t'+str(t.total_steps)+'\n') for t in top_list])
    return HttpResponse(t.render(c))

Cependant, lorsque je clique sur le bouton "soumettre", j'obtiens l'erreur 403:

CSRF verification failed. Request aborted.

J'ai inclus {% csrf_token %} dans index.html. Cependant, s'il s'agit d'un problème RequestContext, je n'ai vraiment aucune idée de l'endroit et de la façon de l'utiliser. Je veux que tout se passe sur la même page (index.html).

14
Bebe

Utilisez le raccourci render qui ajoute RequestContext automatiquement.

from Django.http import HttpResponse
from Django.shortcuts import get_object_or_404, render
from steps_count.models import Top_List
from steps_count.forms import Top_List_Form


def index(request):

    if request.method == 'POST':
        #form = Top_List_Form(request.POST)
        return HttpResponse("Do something") # methods must return HttpResponse
    else:
        top_list = Top_List.objects.all().order_by('total_steps').reverse()
        #output = ''.join([(t.name+'\t'+str(t.total_steps)+'\n') for t in top_list])
        return render(request,'steps_count/index.html',{'top_list': top_list})
14
Burhan Khalid

Lorsque vous avez trouvé ce type de message, cela signifie que le jeton CSRF est manquant ou incorrect. Vous avez donc deux choix.

  1. Pour les formulaires POST, vous devez vous assurer:

    • Votre navigateur accepte les cookies.

    • Dans le modèle, il y a une balise de modèle {% csrf_token%} à l'intérieur de chaque formulaire POST qui cible une URL interne.

  2. L'autre méthode simple consiste à commenter une ligne (NOT RECOMMENDED) ('Django.middleware.csrf.CsrfViewMiddleware') dans MIDDLEWARE_CLASSES à partir de l'onglet de configuration.

    MIDDLEWARE_CLASSES = (
        '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',
    

    )

6
Rajan Mandanka

Vous avez peut-être manqué l'ajout de ce qui suit à votre formulaire:

{% csrf_token %}
4
unixia

Une erreur courante consiste à utiliser render_to_response (ce qui est couramment utilisé dans les anciens didacticiels), qui n'inclut pas automatiquement RequestContext. Le rendu l'inclut automatiquement.

J'ai appris cela lors de la création d'une nouvelle application tout en suivant un didacticiel et CSRF ne fonctionnait pas pour les pages de la nouvelle application.

1
Pstrazzulla

Si vous mettez {%csrf_token%} et vous avez toujours le même problème, veuillez essayer de changer votre angular. Cela a fonctionné pour moi. Initialement, j'ai rencontré ce problème lors de l'utilisation de angular 1.4 Version .x. Après l'avoir dégradé en angular 1.2.8, mon problème a été corrigé. N'oubliez pas d'ajouter angular-cookies.js et de le mettre dans votre fichier js.
Si vous utilisez la demande de publication.

app.run(function($http, $cookies) {
    console.log($cookies.csrftoken);
    $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;
});
0

Dans votre en-tête HTML, ajoutez

<meta name="csrf_token" content="{{ csrf_token }}">

Puis dans votre config JS/angulaire:

app.config(function($httpProvider){
    $httpProvider.defaults.headers.post['X-CSRFToken'] = $('meta[name=csrf_token]').attr('content');
}
0
Olansile Ajibola

Une autre façon de résoudre ce problème consiste à utiliser '@csrf_exempt' annotation.

utilisez simplement @csrf_exempt sur votre méthode.

from Django.views.decorators import csrf_exempt

@csrf_exempt
def index(request):

et vous n'avez pas besoin de spécifier {% csrf_token %} dans votre html.

bon apprentissage..

0
Bandham Manikanta
function yourFunctionName(data_1,data_2){
        context = {}
        context['id'] = data_1
        context['Valid'] = data_2
        $.ajax({
            beforeSend:function(xhr, settings) {
                    function getCookie(name) {
                            var cookieValue = null;
                            if (document.cookie && document.cookie != '') {
                                var cookies = document.cookie.split(';');
                                for (var i = 0; i < cookies.length; i++) {
                                    var cookie = jQuery.trim(cookies[i]);
                                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                                        break;
                                    }
                                }
                            }
                            return cookieValue;
                        }
                        if (settings.url == "your-url")
                            xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
                    },

            url: "your-url",
            type: "POST",
            data: JSON.stringify(context),
            dataType: 'json',
            contentType: 'application/json'
        }).done(function( data ) {
    });
0
Rajan Mandanka