не предоставил {% csrf_token%} в шаблоне, но HTTP-ответ соответствует 200, не должен быть запрещен 403?!
setting.py
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
url .py
urlpatterns = [
path('admin/', admin.site.urls),
path("formtest", view.formPostTest),
]
шаблон formPostTest. html
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form class="" action="/formtest" method="post">
<label for="username">username: </label><input type="text" name="username" value="">
<label for="password">password: </label><input type="password" name="password" value="">
<input type="submit" name="submit" value="submit">
</form>
</body>
</html>
view.py
def formPostTest(request):
if request.method == "GET":
cont = {}
return render(request, "formPostTest.html", cont)
elif request.method == "POST":
return HttpResponse("done")
не только то, что я устал делать все, чтобы его пропустить вверх, я подделал файл cookie csrftoken снимок экрана сетевого монитора
он всегда дает 200 ОК, независимо от того, какую единственную проблему он дает в консоли
console
Forbidden (CSRF cookie not set.): /formtest
Forbidden (CSRF cookie not set.): /formtest
[07/May/2020 02:21:07] "POST /formtest HTTP/1.1" 200 4
и иногда вместо этого
Forbidden (CSRF token missing or incorrect.): /formtest
[07/May/2020 02:28:44] "POST /formtest HTTP/1.1" 200 4
django версия 2.0.5 , python версия 3.6.5
РЕДАКТИРОВАТЬ (05.08.2020):
покопавшись в django исходном коде, я обнаружил несколько вещей:
CsrfViewMiddleware
(ответственный защиты csrf) никогда не поднимайте PermissionDenied
(запрещено 403). как я могу изменить это поведение?
ошибка / предупреждение консоли Forbidden (CSRF cookie not set.)
печатается, когда csrf token cook ie не установлен (обычно причина в том, что представление, обрабатывающее POST, отличается от того, которое отправляет его, решено декоратором ensure_csrf_cookie
)
ошибка / предупреждение консоли Forbidden (CSRF token missing or incorrect.)
печатается, когда csrf token cook ie и несоленый шифр csrfmiddlewaretoken не совпадают (я не смог найти причина для этого, но добавив CSRF_COOKIE_AGE
, я решил, как это решить.