2016-02-13 74 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