【问题标题】:Forbidden (403) CSRF verification failed. Request aborted 2 in django 1.8.5禁止 (403) CSRF 验证失败。 django 1.8.5 中的请求中止 2
【发布时间】:2016-05-12 06:15:23
【问题描述】:

我知道这个问题问了很多次。

我的 CSRF 令牌工作正常。但现在它给出了错误:

Forbidden (403) CSRF verification failed. Request aborted 2

我尝试了很多方法,例如删除 cookie、历史记录和更改表单操作中的完整网址,但没有任何效果。

HTML 表单

 <form method="POST" action="/daily_sale/">
                        {% csrf_token %}
                        <div class="panel-heading">

                            <button class="btn btn-primary pull-right">Search</button>
                            <span class="pull-right">&nbsp;</span>
                            <span class="form-group pull-left">
                                <input type="text" class="form-control" name="start" placeholder="Start Date" value = "{{start_date}}">
                            </span>
                            <span class="pull-right">&nbsp;</span>
                            <span class="form-group pull-right">
                                <input type="text" class="form-control" name="end" placeholder="End  Date" value="{{end_date}}">
                            </span>
                        </div>
                    </form>

我也尝试在 form tag 中更改操作

action="http://localhost:9002/daily_sale/"

view.py

from django.shortcuts import render , redirect


@login_required(login_url='/login_form/')
def dailySale(request):
user_id = request.user.id

reports = Reports()

if request.method == 'GET':
    # do some thing

if request.method == 'POST':
    print "inside post method"
    start_date = request.POST.get('start')
    end_date = request.POST.get('end')
    print "start  = ", start_date,"\n end  = ",end_date
    year = request.POST.get('year')
    month = request.POST.get('month')
    sale = reports.getSaleData(start_date,end_date,user_id)
    day = sale[0]
    sale_value = sale[1]
    sale_qty = sale[2]
    sale_data = zip(day, sale_value, sale_qty)

    sal = reports.get_sale_wise_channel(start_date,end_date,user_id)
    channel = sal[0]
    brand = sal[1]
    category = sal[2]
    selling_price = sal[3]
    quantity_sold = sal[4]
    percentage = sal[5]

    returns = reports.getReturns(start_date,end_date,user_id)
    order_item_ids = returns[1]
    order_date = returns[0]
    channel = returns[2]
    sku = returns[3]
    return_data = zip(order_item_ids, order_date, channel,sku)
    sal_data = zip(channel,brand,category,selling_price,quantity_sold,percentage)



    context_dict = {'sale_data':sale_data,
                     'sal_data':sal_data,                        
                     'start_date':start_date,
                     'end_date':end_date,
                    'month':month,
                    'year':year}
    return render(request, 'daily_sale.html', context_dict)

使用 get 方法或第一次运行时可以正常工作。

但是当我们尝试使用 POST 方法时,它会报错。

【问题讨论】:

  • 每次都需要更新csrf token:update(csrf(request)
  • 我应该将此行与 get 或其他任何地方的渲染放在哪里
  • 每次渲染新模板时都需要更新token,所以在GET部分。
  • 我没有get方法的表单
  • 抱歉尝试将其添加到您的帖子中,例如 context_dict.update(csrf(request))

标签: python django csrf


【解决方案1】:

要解决(403) CSRF verification 错误,您需要在每次呈现表单时更新请求上下文中的 csrf 令牌:

所以将这些添加到您的 GET 和 POST 方法中

context_dict.update(csrf(request))

别忘了在视图顶部导入 csrf:

from django.views.decorators.csrf import csrf_protect

如果您在处理表单时仍有问题,请考虑使用ModelForms,这是在 django 中推荐且更强大的表单处理方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 2016-08-27
    • 2017-06-26
    • 2018-06-06
    • 2019-07-22
    • 2017-08-06
    • 2017-05-11
    相关资源
    最近更新 更多