2013-02-23 6 views
0

я получаю сообщение об ошибке при использовании POST в моей форме, хотя я добавил csrf_token к моей форме ....Джанго POST запрос неудача

Ошибка

Forbidden (403)

CSRF проверка не выполнена. Запрос прерван.

Помощь

Причина дается для отказа: CSRF печенья не установлено.

В общем, это может произойти, если существует подлинная подделка запроса на кросс-сайт или когда механизм CSRF Django используется неправильно. Для форм POST вам необходимо: • Ваш браузер поддерживает cookies. • Функция просмотра использует RequestContext для шаблона вместо Context. • В шаблоне внутри каждой формы POST есть тег шаблона {% csrf_token%}, который предназначен для внутреннего URL-адреса. • Если вы не используете CsrfViewMiddleware, вы должны использовать csrf_protect для любых представлений, использующих тег шаблона csrf_token, а также те, которые принимают данные POST.

Вы видите раздел справки этой страницы, потому что у вас DEBUG = True в файле настроек Django. Измените это на False, и отобразится только начальное сообщение об ошибке.

Вы можете настроить эту страницу, используя настройку CSRF_FAILURE_VIEW.

views.py 

def search_form(request): 
    return render_to_response('search_form.html') 
def search(request): 
    print 'request.post=', request.POST 
    print 'request.get=', request.GET 
    print 'request.method=', request.META.get('REQUEST_METHOD') 
    if 'q' in request.GET: 
     message = 'You searched for :%r' % request.GET['q'] 
    else: 
     message = 'You submitted an empty form' 

    return HttpResponse(message) 



search-form.html 

<html> 
<head> 
    <title>Search</title> 
</head> 
<body> 
    <form action="/polls/search/" method="post">{% csrf_token %} 
     <input type="text" name="q"> 
     <input type="submit" value="Search"> 
    </form> 
</body> 
</html> 

urls.py 
urlpatterns = patterns('',url(r'^$',views.index,name='index'), 
     url(r'^meta/',views.display_meta,name='meta'), 
     url(r'^search-form/$',views.search_form), 
     url(r'^search/',views.search), 

ответ

0

Вы не добавили токен в свою форму.

Вы добавили код {% csrf_token %}, но django.core.context_processors.csrf не используются, поэтому тег шаблона фактически ничего не выводит (теги шаблонов терпят неудачу).

Вместо использования HttpResponse, вам нужно render_to_response()RequestContext) или просто render() (который обрабатывает RequestContext для вас).

С другой стороны, для этого вам не нужны два вида. search следует обрабатывать как рендеринг формы и обработки формы -

от django.shortcuts импорта оказывают

def search(request): 
    if request.method == POST: 
     print 'request.post=', request.POST 
     print 'request.get=', request.GET 
     print 'request.method=', request.META.get('REQUEST_METHOD') 
     if 'q' in request.GET: 
      message = 'You searched for :%r' % request.POST['q'] 
     else: 
      message = 'You submitted an empty form' 
     return render(request, 'search_form.html', {'message': message}) 
    return render(request, 'search_form.html') 

Затем добавьте переменную {{ message }} в свой search_form.html шаблон - вероятно, в какой-то, если заявление для достижения того же что вы сейчас делаете -

<body> 
    {% if message %} 
     <div> {{ message }} </div> 
    {% else %} 
     <form action="/polls/search/" method="post">{% csrf_token %} 
      <input type="text" name="q"> 
      <input type="submit" value="Search"> 
     </form> 
    {% endif %} 
</body> 
2

Вы хотите увидеть пункт № 3 here. Вы возвращаете простой HttpResponse, поэтому я думаю, что обработчик контекста csrf пропускается. Возможно, вы захотите использовать вместо этого django.shortcuts.render. Кроме того, в вашем шаблоне ваш метод формы «post», но, на ваш взгляд, вы проверяете request.GET. Это не связано с проблемой CSRF, которую вы имеете, но это то, что вы хотите исправить.

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