首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CSRF核查在django失败

CSRF核查在django失败
EN

Stack Overflow用户
提问于 2016-02-13 15:48:25
回答 2查看 760关注 0票数 1

我正在尝试完成一个geo Django教程,这是相当古老的(1.3)。到现在为止,我做得很好,但我犯了一个错误。

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

代码语言:javascript
运行
复制
# 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现在我知道它与:

代码语言:javascript
运行
复制
<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>

但我不知道怎么解决它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-13 16:25:21

正如@Selcuk所建议的,在视图函数上使用Django装饰器csrf_exempt应该可以修复这个问题。但是,考虑到它不会保护您的请求免受CSRF攻击。

您可以阅读更多关于它是如何工作的这里

代码语言:javascript
运行
复制
# 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
EN

Stack Overflow用户

发布于 2016-02-13 16:41:25

解决这个问题的正确方法是向Django模板中添加一个{% csrf_token %}。您需要一个表单标记才能工作,而且无论如何您都应该有一个表单标记。否则,浏览器如何知道在哪里发送数据?

代码语言:javascript
运行
复制
<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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35381868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档