2016-02-13 115 views
1

我正在嘗試完成一個相當舊的geo Django tutorial(1.3)。直到現在我做得很好,但我被困在一個特定的錯誤。在Django中CSRF驗證失敗

我想建立功能,我保存一些數據到數據庫中的表。 這是我的看法:

# Import django modules 
from django.shortcuts import render_to_response 
from django.template.loader import render_to_string 
from django.http import HttpResponse 
import simplejson 
from waypoints.models import Waypoint 

def save(request): 
'Save waypoints' 
for waypointString in request.POST.get('waypointsPayload', '').splitlines(): 
    waypointID, waypointX, waypointY = waypointString.split() 
    waypoint = Waypoint.objects.get(id=int(waypointID)) 
    waypoint.geometry.set_x(float(waypointX)) 
    waypoint.geometry.set_y(float(waypointY)) 
    waypoint.save() 
return HttpResponse(simplejson.dumps(dict(isOk=1)), mimetype='application/json') 

當我選擇保存按鈕,我得到一個錯誤(螢火蟲):403禁止 現在我知道,與有關:

<h1>Forbidden <span>(403)</span></h1> 
<p>CSRF verification failed. Request aborted.</p> 

但我沒有想法如何解決它。

+0

要麼添加'{%csrf_token%}'你的HTML'

'標籤(SAFE)後或添加'def save(request):'(unsafe)之前的@csrf_exempt – Selcuk

+0

@Selcuk非常感謝你的回答。你可以請更具體一點。現在我沒有任何表單標籤。只是:我應該將它添加到輸入嗎? – user1919

+0

[Django - CSRF驗證失敗]的可能重複(http://stackoverflow.com/questions/4547639/django-csrf-verification-failed) – Selcuk

回答

1

正如@Selcuk建議的,使用Django修飾器csrf_exempt您的視圖函數應該解決這個問題。但是,請注意,它不會保護您的請求免受CSRF攻擊。
你可以閱讀更多關於它是如何工作的here

# Import django modules 
from django.http import HttpResponse 
# import csrf_exempt 
from django.views.decorators.csrf import csrf_exempt 
# Import system modules 
import simplejson 
# Import custom modules 
from googlemaps.waypoints.models import Waypoint 

@csrf_exempt 
def save(request): 
    'Save waypoints' 
    for waypointString in request.POST.get('waypointsPayload', '').splitlines(): 
     waypointID, waypointX, waypointY = waypointString.split() 
     waypoint = Waypoint.objects.get(id=int(waypointID)) 
     waypoint.geometry.set_x(float(waypointX)) 
     waypoint.geometry.set_y(float(waypointY)) 
     waypoint.save() 
    return HttpResponse(simplejson.dumps(dict(isOk=1)), mimetype='application/json') 
+0

是的。這樣做的竅門,但爲什麼它不認爲安全的方式? – user1919

+1

我編輯了我的答案@dkar。 – Forge

+0

除非你有很好的理由,否則不要使用它。 CSRF是一種安全措施,可避免其他人員以您的名義發佈數據。看到我的答案爲安全的解決方案。 –

1

解決此問題的正確方法是向您的Django模板添加{%csrf_token%}。你需要一個表單標籤才能工作,無論如何你都應該有一個。否則,瀏覽器如何知道將數據發送到哪裏?

<form action="" method="post"> 
    {% csrf_token %} 
    <input id=saveWaypoints type=button value=Save disabled=disabled> 
</form 

Django文檔對CSRF如何工作的很多很好的信息,以及它爲什麼重要: https://docs.djangoproject.com/en/1.9/ref/csrf/#how-to-use-it