2016-02-13 4 views
1

Я пытаюсь закончить geo Django tutorial, который довольно старый (1.3). До сих пор я отлично справлялся, но у меня была определенная ошибка.Не удалось проверить CSRF в django

Я пытаюсь создать функциональность, в которой я сохраняю некоторые данные в таблице в 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') 

Когда я выбираю кнопку Сохранить, я получаю сообщение об ошибке (в поджигатель): 403 Forbidden Теперь я знаю, что связано с:

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

Но у меня нет Идея, как это исправить.

+0

Либо добавить '{% csrf_token%}' после HTML '

' тегов (безопасно) или добавить @csrf_exempt перед 'def save (request):' (небезопасно) – 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

Правильный способ решения этого вопроса - добавить {% csrf_token%} к вашему шаблону Django. Для этого вам нужен тег формы, и вы должны иметь его, несмотря ни на что. В противном случае, как браузер знает, куда отправлять ваши данные?

<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

Смежные вопросы