我正在尝试完成一个geo Django教程,这是相当古老的(1.3)。到现在为止,我做得很好,但我犯了一个错误。
我正在尝试构建将一些数据保存到db中的表中的功能。这是我的看法:
# 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')
当我选择Save按钮时,我得到一个错误(在firebug中):403现在我知道它与:
<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>
但我不知道怎么解决它。
发布于 2016-02-13 16:25:21
正如@Selcuk所建议的,在视图函数上使用Django
装饰器csrf_exempt
应该可以修复这个问题。但是,考虑到它不会保护您的请求免受CSRF
攻击。
您可以阅读更多关于它是如何工作的这里。
# 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')
发布于 2016-02-13 16:41:25
解决这个问题的正确方法是向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
https://stackoverflow.com/questions/35381868
复制相似问题