正在删除Django中的对象



在Django中删除对象的最佳做法是什么?使用简单的";标签";链接到如下视图:

def deleteStudent(request,id):
student = get_object_or_404(Student, id = id)
student.delete()
return redirect('/')

或使用后处理方法:

<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标准。正如HTTP规范[w3.org]中关于安全方法的标准所说:

特别是,已经制定了一个惯例,即GET和HEAD方法不应该具有采取除检索之外的操作的意义。这些方法应该被认为是";安全";。

因此,您不能让GET请求删除项目:像谷歌机器人这样的抓取器可能会意外触发此视图,从而删除数据。

如果要删除项目,通常可以通过DELETE请求或POST请求来完成。这也是DeleteView[Django-doc]的实现方式:它将删除DELETE或POST请求的对象。其想法是,对于GET请求,您可以呈现一个模板,例如,该模板询问您是否确定要删除该项,然后在用户确认时发出POST(或DELETE(请求。

视图通常还将检查用户是否被授权这样做:例如;所有者;允许对象的移除这样的项,则视图应该对此进行验证。

我在课程中看到人们同时使用这两种方法。

第一个是不是好主意,违反了HTTP标准。任何使用此选项的课程都会带来安全风险。

最新更新