2015-01-10 142 views
0

我在django項目上創建表單。我有一個錯誤csrf失敗。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> 

+1

首先,您應該將action =「/ durum」更改爲action =「。」。因爲大部分時間都發布到相同的URL – Alvaro

+0

第二,因爲您沒有呈現模板,所以從不創建csrf標記。嘗試使用return render() – Alvaro

+2

我不明白你爲什麼要使用Django,如果你想使用平面HTML並直接執行SQL。 –

回答

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會proccess您的模板,並呈現一個正確的csrf_token。我強烈建議您按照djangoproject.com上的教程進行操作,並使用ORM

1

您應該使用django模板和RequestContext。 非常快速的方法來檢查: 在您的應用程序文件夾中創建以下目錄結構:應用程序的

1.templates/myapp_name 使用名稱,而不是項目名稱!

  • 在視圖中創建文件my_template.html

  • 增加進口:

    從django.shortcuts進口呈現

  • 加取代你用

    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 instea d 它將爲您完成所有工作!

    相關問題