django CSRF验证失败。请求中止

时间:2015-01-10 15:20:44

标签: python django python-2.7 django-forms

我在django项目上创建表单。我有一个错误csrf失败。

我的wievs.py文件:

def durum(request): 
    if request.method == "POST":
        adi = request.POST.get('durum')
        db = sql.connect("/usr/connect.db")
        im = db.cursor()
        db.execute("INSERT INTO durum VALUES ("+str(adi)+")")
        db.commit()
        asd = "Durum mesajı '"+str(adi)+"' olarak değiştirildi."
        return render(request, asd, {})
    else:
        BASE = os.path.dirname(os.path.abspath(__file__))
    return HttpResponse(open(os.path.join(BASE, "html/durum.html")).read())

我的urls.py文件:

url(r'^durum/', db.durum),

我的html文件:

<form action="/durum" method="post">
{% csrf_token %}
<table>
    <tr><th>Durum Mesajı:</th><td><input type="text" name="durum"/></td></tr>
     <tr><th></th><td><input type="submit" value="Ekle"/></td></tr>
</table>

2 个答案:

答案 0 :(得分:2)

您应该按照“django-way”来渲染模板。视图的工作方式是将模板作为普通html发送而不是处理它。 试试这种方式:

def durum(request): 
if request.method == "POST":
    adi = request.POST.get('durum')
    db = sql.connect("/usr/connect.db")
    im = db.cursor()
    db.execute("INSERT INTO durum VALUES ("+str(adi)+")")
    db.commit()
    asd = "Durum mesajı '"+str(adi)+"' olarak değiştirildi."
    return render(request, asd, {})
else:
    return render('your_template_name.html', context_instance=RequestContext(request))

这样,django将处理你的模板并呈现正确的csrf_token。我强烈建议您按照djangoproject.com上的教程进行操作,并使用ORM

答案 1 :(得分:1)

您应该使用django模板和RequestContext。 检查它的速度非常快: 在您的app文件夹中创建以下目录结构:

1.templates / myapp_name 使用应用程序的名称,而不是项目名称!

  1. 创建文件my_template.html

  2. 在您的视图中添加导入:

    来自django.shortcuts导入渲染

  3. 使用

    添加替换回报
    return render('myapp_name/my_template.html')
    

    阅读有关配置模板目录的更多信息: Django template Path

    了解有关渲染的更多信息: https://docs.djangoproject.com/en/1.7/intro/tutorial03/#a-shortcut-render

    注意: 使用django表单而不是你的方式更好: https://docs.djangoproject.com/en/1.7/topics/forms/  和基于类的视图而不是函数(相信我看起来很复杂 - 它们真的很棒: https://docs.djangoproject.com/en/1.7/topics/class-based-views/

    另请尝试不要使用硬编码的网址,而是使用https://docs.djangoproject.com/en/1.7/topics/http/urls/#reverse-resolution-of-urls 它将为您完成所有工作!