Как поместить 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 в шаблоне, если только у нас нет особых требований.

Вернуться на верх