Удаление объекта в Django
Какая лучшая практика удаления объекта в Django? Используя простой "a tag" со ссылкой на представление, как это:
def deleteStudent(request,id):
student = get_object_or_404(Student, id = id)
student.delete()
return redirect('/')
или используя метод post:
<form method="POST">
{% csrf_token %}
Are you want to delete this item ?
<input type="submit" value="Yes" />
<a href="/">Cancel </a>
</form>
и в представлениях:
def deleteStudent(request, id):
student = get_object_or_404(Student, id = id)
if request.method =="POST":
student.delete()
return redirect('/')
return render(request, "delete_view.html")
Я видел в курсах, что люди используют оба метода (это пример кода, я не тестировал его и не защищал представления). Так вот, если мы можем удалять объекты методом "POST", могу ли я сказать на собеседовании, что "метод POST также может быть использован для удаления объектов"? Спасибо за все ответы.
Первый нарушает стандарт HTTP. Как сказано в стандарте safe methods спецификации HTTP [w3.org]:
В частности, было установлено, что методы GET и HEAD НЕ ДОЛЖНЫ иметь значение для выполнения какого-либо действия, кроме извлечения. Эти методы должны считаться "безопасными".
Таким образом, вы не можете позволить GET-запросу удалить элемент: скреперы, такие как бот Google, могут случайно вызвать это представление и таким образом удалить данные.
If you want to remove items, usually you do this by a DELETE request, or a POST request. This is also how the DeleteView
[Django-doc] is implemented: it will remove the object for a DELETE or POST request. The idea is that for a GET request, you can render a template for example that asks if you are sure you want to remove that item, and thus then make a POST (or DELETE) request when the user confirms.
Часто представление также проверяет, уполномочен ли пользователь делать это: например, если только "владелец" объекта может удалить такой элемент, то представление должно подтвердить это.
Я видел на курсах, что люди используют оба метода.
Первый вариант является не хорошей идеей и нарушает стандарты HTTP. Любой курс, использующий это, вводит риски безопасности.