Django csrf验证失败。请求中止。一切就绪后,csrf令牌丢失或不正确

时间:2017-10-31 13:23:14

标签: ajax django django-csrf

我有一个html页面(用WYSIWYG完成),在这个页面上我有一个与页面一样大的表单(因为我有很多值我希望能够发送回我的视图所以我可以添加值在模板中)。

到目前为止一切正常,我可以将我的值发送回我的视图并将它们添加到数据库中。

在这个页面上我也有两个组合框,目标是一旦第一个有一个选定的值,该值就会被发送回视图,这样我就可以生成第二个组合框内的数据。

问题是,对于此操作,我只收到消息

  

Django csrf验证失败。请求中止。 csrf令牌丢失   

中间件设置:

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

模板:

<form id="frm" method="post" enctype="text/plain">{% csrf_token %}

<select name="typeMvmt" size="1" id="typeMvmt" onchange="document.getElementById('ebIdTypeMVT').value = document.getElementById('typeMvmt').value;veriftype();displayProduit();check();send_post();return false;" style="position:absolute;left:220px;top:5px;width:350px;height:28px;z-index:257;">
<option value="0">-- SELECTIONNER UN TYPE DE MOUVEMENT --</option>
{% for typemouvement in typemouvements %}
<option value={{typemouvement.id}}>{{typemouvement.libelle}}</option>
{% endfor %}
</select>
</form>

查看:

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

    #Connection to 'erp-site' DB 
    cursor = connections['erp-site'].cursor()
    try:
        #Get Produits list from Espe
        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()
    if request.method == 'POST':
        if request.POST.get("form_type") == 'formMVT':
            #Handle Elements from first Form
            value = request.POST.get('typeMvmt')
            Req = TbTypeMouvement.objects.filter(value)
            data = getDataQuery(Req)
            return HttpResponse(json.dumps(data), content_type = "application/json")
        elif request.POST.get("form_type") == 'formEspece':
            typemouvement = request.POST.get('idtypemouvement')
            soustype = request.POST.get('idsoustype')
            recolte = request.POST.get('recolte') 
            groupe = request.POST.get('groupe')
            categorie = request.POST.get('categorie')
            code = request.POST.get('code')
            collecte = request.POST.get('collecte')
            vente = request.POST.get('vente')
            stock = request.POST.get('stock')
            achat = request.POST.get('achat')
            transporteur = request.POST.get('codetransporteur')
            blLivreur = request.POST.get('blLivreur', '')
            contratClient = request.POST.get('contratClient')   
            pont1 = request.POST.get('pont1')               # BIGINT
            numTicket = request.POST.get('numTicket')       # INT
            dateheure1 = request.POST.get('dateheure1')     # DATETIME
            poid1 = request.POST.get('poid1')               # INT
            dsd1 = request.POST.get('dsd1')                 # INT
            pont2 = request.POST.get('pont2')               # BIGINT
            dateheure2 = request.POST.get('dateheure2')     # DATETIME
            poid2 = request.POST.get('poid2')               # INT
            dsd2 = request.POST.get('dsd2')                 # INT
            p1p2 = request.POST.get('p1p2')                 # INT
            livreur = request.POST.get('idlivreur')         # BIGINT
            vehicule = request.POST.get('vehicule')         # VARCHAR
            comTicket = request.POST.get('comTicket')       # VARCHAR
            comLogiciel = request.POST.get('comLogiciel')   # VARCHAR
            espece = request.POST.get('especeId')             # BIGINT
            produit = request.POST.get('produitId')           # BIGINT
            #Connection to 'erp-site' DB
            cursor = connections['pontbascule'].cursor()
            try:
            #Get Produits list from Espece
                query = "{CALL SP_webADD_MANUAL_PESEE(%s,%s,%s,%s,%s, %s,%s,%s,%s,%s, %s,%s,%s,%s,%s,%s,%s)}"
                arguments = (pont1, numTicket, dateheure1, poid1, dsd1,pont2, numTicket, dateheure2, poid2, dsd2, p1p2,livreur, vehicule,comTicket, comLogiciel,espece, produit)
                cursor.execute(query, arguments)
                idCreatedPesee = cursor.fetchone()
            finally:
                cursor.close()
            cursor = connections['site'].cursor()
            try:
                query = "{CALL SP_webCREATE_MVT_INIT(%s,%s,%s, %s)}"
                arguments = (idCreatedPesee[0], typemouvement, soustype, transporteur)
                cursor.execute(query, arguments)
                idCreatedMVT = dictfetchall(cursor)
            finally:
                cursor.close()
    return render(request, 'mouvementCreation.html', locals())

我尝试使用一个表单制作相同的页面我得到相同的结果,到目前为止我只使用ajax与Datatable并没有问题,希望有人可以分享我的问题。

我使用Firefox,我看了一下设置cookie等......但似乎没什么用。

0 个答案:

没有答案