django中的CSRF验证失败

时间:2016-02-13 15:48:25

标签: python django geodjango

我正在尝试完成geo Django tutorial,这是很老的(1.3)。直到现在我做得很好,但我遇到了一个特定的错误。

我正在尝试构建在db中将一些数据保存到表中的功能。 这是我的观点:

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

当我选择Save按钮时,我收到一个错误(在firebug中):403 Forbidden 现在我知道这与:

有关
npm install input-moment --save

但我不知道如何解决它。

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分: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