У меня есть контактная форма в 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 ... любая помощь будет отличной.
Вы обслуживаете свой сайт через 'https'? Является ли это * весь сайт таким, или просто формой? Если браузер первоначально отправил cookie через 'http', я не думаю, что он вернет его при отправке формы через' https'. –