Как поместить csrf_token внутрь представления формы django
Я новичок в django и столкнулся со странной проблемой. Если я создаю шаблон django и вставляю внутрь {% csrf_token %}, он работает хорошо, но если я ставлю декоратор @csrf_protect на view, он выдает мне Forbidden 403 (CSRF verification failed. Request aborted). Как я понял из документации django, я не могу использовать одновременно CsrfViewMiddleware и @csrf_protect.
Вот в чем вопрос:
Можно ли сделать проверку csrf внутри представления или в таких ситуациях всегда нужно писать шаблоны?
@csrf_protect
def create_group(request):
if request.method == "POST":
Group.objects.create(**{key: request.POST[key] for key in request.POST})
return HttpResponseRedirect(reverse("groups:groups"))
elif request.method == "GET":
pass
return HttpResponse(create_group_form)
create_group_form = """
<form method="POST">
<label for="course">Course:</label><br>
<input type="text" id="course" name="course"><br><br>
<label for="length_in_months">Length in months:</label><br>
<input type="number" id="length_in_months" name="length_in_months" min=1 max=12 required><br><br>
<label for="price">Price:</label><br>
<input type="number" id="price" name="price" min=1000 max=50000 required><br><br>
<label for="number_of_students">Number of students:</label><br>
<input type="number" id="number_of_students" name="number_of_students" min=3 max=30 required><br><br>
<label for="lesson_duration">Lesson duration:</label><br>
<input type="number" id="lesson_duration" name="lesson_duration" min=1 max=5 required><br><br>
<label for="website">Website:</label><br>
<input type="url" id="website" name="website"><br><br>
<input type="submit" value="Submit">
</form> """
Лучше использовать CsrfViewMiddleware
в качестве общей защиты. Если вы забудете добавить декоратор к вашим представлениям, это создаст проблемы с безопасностью. Вы должны использовать его на представлениях, которые назначают CSRF tokens
на вывод, и на тех, которые принимают данные из формы POST
. Поэтому в качестве лучшей практики лучше использовать CSRF token
в шаблоне, если только у нас нет особых требований.