2014-09-21 2 views
2

У меня есть контактная форма в Django для моего сайта, и когда я тестировал ее локально, она работала нормально, но теперь, когда я пытаюсь представить свою контактную форму «вживую», она всегда придумывает 403 Запрещена верификация CSRF.Django - 403 Неверная проверка CSRF не удалась

вид:

def contact(request): 
    if request.method == 'POST': 
     form = ContactForm(request.POST) 
     if form.is_valid(): 
      cd = form.cleaned_data 
      send_mail(
       cd['subject'], 
       cd['message'], 
       cd.get('email', '[email protected]'), 
       ['[email protected]'], 
      ) 
      return HttpResponseRedirect('/thanks/') 
    else: 
     form = ContactForm() 
    return render(request, 'contact/contact.html', {'form': form}) 

contact.html

{% extends 'site_base.html' %} 

{% block head_title %}Contact{% endblock %} 

{% block body %} 

     <h2>Contact Us</h2> 
     <p>To send us a message, fill out the below form.</p> 

    {% if form.errors %} 
     <p style="color: red;"> 
      Please correct the error{{ form.errors|pluralize }} below. 
     </p> 
    {% endif %} 

    <form action="" method="POST"> 
    {% csrf_token %} 
     <table> 
      {{ form.as_table }} 
     </table> 
     <br /> 
     <button type="submit" value="Submit" class="btn btn-primary">Submit</button> 
    </form>  

{% endblock %} 

параметры (те, я думал, что было бы уместно):

SESSION_COOKIE_SECURE = True 
CSRF_COOKIE_SECURE = True 
SESSION_EXPIRE_AT_BROWSER_CLOSE = True 
MIDDLEWARE_CLASSES = [ 
    "django.middleware.csrf.CsrfViewMiddleware", 
    "django.middleware.common.CommonMiddleware", 
    "django.contrib.sessions.middleware.SessionMiddleware", 
    "django.contrib.auth.middleware.AuthenticationMiddleware", 
    "django.contrib.messages.middleware.MessageMiddleware", 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

После попытки исключить некоторые вещи, вот что я обнаружил. Когда я прокомментирую SESSION_COOKIE_SECURE = TRUE и CSRF_COOKIE_SECURE = TRUE и SESSION_EXPIRE_AT_BROWSER_CLOSE = TRUE, это не проблема.

Если я просто прокомментирую CSRF_COOKIE_SECURE = TRUE, он отлично работает. Что-то странное, похоже, происходит с тем, как я обрабатываю CSRF ... любая помощь будет отличной.

+1

Вы обслуживаете свой сайт через 'https'? Является ли это * весь сайт таким, или просто формой? Если браузер первоначально отправил cookie через 'http', я не думаю, что он вернет его при отправке формы через' https'. –

ответ

6

Мне кажется, что сайт не https, если он работает, когда вы прокомментируете эту строку? CSRF_COOKIE_SECURE=True делает токен csrf только работает с ssl на документы https://docs.djangoproject.com/en/1.7/ref/settings/#csrf-cookie-secure

+0

Возможно, это проблема. В настоящий момент мне не нужен мой сайт для использования https, поэтому я просто оставлю это прокомментированным. Благодаря! – Eli

+0

@webbyfox: действительно? просто отключите защиту csrf? – Hussam

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

  • Нет связанных вопросов^_^