【问题标题】:CSRF verification failed. Request aborted. (Forbidden (403)) DJANGOCSRF 验证失败。请求中止。 (禁止(403))DJANGO
【发布时间】:2017-12-11 15:41:28
【问题描述】:

我正在尝试从 2 个不同的下拉列表中获取 POST,我已经从 POST 中获取了参数,但是我遇到了 CSRF 令牌的问题 ....

index.html

<form method="post" action="/getdata/">{% csrf_token %}
    <select name="Lista">
        <option selected="selected" disabled>Objects on page:</option>
        <option value="10">10</option>
        <option value="20">20</option>
        <option value="30">30</option>
        <option value="40">40</option>
        <option value="50">50</option>
    </select>

    <select name="Lista2">
        <option selected="selected" disabled>Objects on page:</option>
        <option value="10">10</option>
        <option value="20">20</option>
        <option value="30">30</option>
        <option value="40">40</option>
        <option value="50">50</option>
    </select>    
    <input type="submit" value="Select">    
</form>

尽管我在我的 html 表单中使用了 csrf 令牌,但它没有用...

views.py

from django.http import HttpResponse
from django.template import loader
from django.shortcuts import render

from view.forms import *
from django.shortcuts import render_to_response, redirect
from view.models import *



def index(request):   
    if request.method == 'POST':        
        Lista = request.POST.get('Lista')
        print "Lista 1 "+Lista
        Lista2 = request.POST.get('Lista2')
        print "Lista 2 "+Lista2

        #FORMS
        form = FormsLista(request.POST)
        if form.is_valid():                
            newPost = Lista(num_lista_1=Lista, num_lista_2=Lista2)                
            newPost.save()              
            context = {                    
                'Lista': Lista,
                'Lista2': Lista2
            }       

            return render(request, 'showdata.html', context)
    else:

        template = loader.get_template('index.html')
        return HttpResponse(template.render())

models.py

from django.db import models

class Lista (models.Model):
    num_lista_1 = models.CharField(max_length=100, null=True)
    num_lista_2 = models.CharField(max_length=100, null=True)
    def __unicode__(self):
        return self.num_lista_1

顺便说一句,我激活了cookies ...

【问题讨论】:

    标签: python django security token


    【解决方案1】:

    要使用Django's CSRF protection,需要用请求对象渲染模板:

    template = loader.get_template('index.html')
    return HttpResponse(template.render(request=request))
    

    如果您在任何地方都使用render,您的代码会更加一致:

    return render(request, 'index.html')
    

    要修复[view] didn't return an HttpResponse 错误,您需要确保索引视图始终返回HttpResponse。目前,当表单无效时,您为 POST 请求返回 None。在 Django 中执行以下操作是很常见的:

    def index(request):   
        if request.method == 'POST':
            ...
        form = FormsLista()
        return render(request, 'index.html', {'form': form})
    

    然后,在您的模板中,您可以显示表单错误。有关详细信息,请参阅 rendering forms 上的文档。

    【讨论】:

    • 我尝试了这两个选项......但我得到了这个错误 视图 tutorial.views.index 没有返回 HttpResponse 对象。它返回 None 。 ...
    • 这是一个单独的问题。正如错误所暗示的,您始终需要返回响应。看看if request.method == 'POST':时会发生什么,但是表单无效。
    • 成功了! ...但我不明白为什么我的 POST 总是无效...有什么想法吗?
    • 如果您查看form.errors,它应该会给您一个提示。如果您仍然遇到问题,请提出一个新问题,因为这是一个单独的问题。
    猜你喜欢
    • 2018-11-05
    • 2018-06-06
    • 2016-08-27
    • 2017-06-26
    • 2019-07-22
    • 2016-05-12
    • 2014-11-15
    • 2017-08-06
    相关资源
    最近更新 更多