Проверка CSRF не прошла. Запрос прерван. После развертывания в облаке
Я написал приложение Django и после разработки поместил его в контейнер Docker и развернул его на Google Cloud Run. Сервер в порядке и работает, но когда я хочу ввести что-то в форму и отправить ее, я получаю эту ошибку:
Запрещено (403) Проверка CSRF не удалась. Запрос прерван.
В чем проблема? Должен ли я добавить что-то помимо csrf_token?
Вот мой views.py:
from django.shortcuts import render, redirect
from . models import Action
##from django.core.mail import send_email
def index (request):
actions = Action.objects.all()
return render(request, 'index.html', {"actions": actions})
def uj_szemely (request):
if request.method == "GET":
return render(request, 'uj_szemely.html')
elif request.method == "POST":
surname = request.POST.get('surname')
lastname = request.POST.get('lastname')
whatdo = request.POST.get('whatdo')
done = request.POST.get('done')
created = request.POST.get('created')
deadline = request.POST.get('deadline')
if done == 'on':
done = True
else:
done = False
formaction = Action(surname=surname, lastname=lastname, whatdo=whatdo, done=done, created=created, deadline=deadline)
formaction.save()
return redirect('fooldal')
def fooldal (request):
return render(request, 'fooldal.html')
Мой models.py:
from pyexpat import model
from django.db import models
class Action (models.Model):
surname = models.CharField(max_length=100)
lastname = models.CharField(max_length=100)
whatdo = models.TextField()
done = models.BooleanField(default=False)
created = models.DateField(auto_now_add=True)
deadline = models.DateTimeField()
У меня также есть страница контактов на сайте, и контактная форма выдает ту же ошибку. Вот мой модуль контактных форм:
from logging import PlaceHolder
from django import forms
temak = [('egyéb', 'Egyéb'), ('reklamáció', 'Reklamáció'),('megkeresés', 'Megkeresés'), ('tájékoztatás', 'Tájékoztatás')]
class ContactForm(forms.Form):
nev = forms.CharField(max_length=50, label="Név", widget=forms.TextInput(attrs={'placeholder': 'Írja be a nevét!'}))
email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Írja be az e-mail címét!'}))
tema = forms.ChoiceField(choices=temak, label="Téma")
uzenet = forms.CharField(label="Üzenet", widget=forms.Textarea(attrs={'placeholder': 'Írjon nekünk...'}))
И views.py моего контакта:
from django.shortcuts import render
from .forms import ContactForm
from django.core.mail import send_mail
from django.core.mail import EmailMessage
def kapcsolat (request):
form = ContactForm()
if request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
nev = form.cleaned_data['nev']
email = form.cleaned_data['email']
tema = form.cleaned_data['tema']
uzenet = form.cleaned_data['uzenet']
email_to_send = EmailMessage (
subject=tema,
body=uzenet,
from_email=email,
to=['dezsoszabolcs46@gmail.com'],
reply_to=[email],
headers={'Content-Type': 'text/plain'}
)
email_to_send.send()
return render(request, 'kapcsolat_valasz.html', {'nev':nev, 'tema':tema})
return render(request, 'kapcsolat.html', {'form':form})
Вы добавили {% csrf_token %} внутрь формы? Пожалуйста, поделитесь кодом вашей формы.
Необходимо добавить CSRF Trusted Origin в settings.py
ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ: Рекомендуется использовать это, когда
запущен в производство. URL будет известен после первого развертывания
в Cloud Run. Этот код берет URL и преобразует его в оба этих формата настроек.
if CLOUDRUN_SERVICE_URL:
ALLOWED_HOSTS = [urlparse(CLOUDRUN_SERVICE_URL).netloc]
CSRF_TRUSTED_ORIGINS = [CLOUDRUN_SERVICE_URL]
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
else:
ALLOWED_HOSTS = ["*"]```