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

特别是,已经建立了约定,即 GET 和 HEAD 方法不应具有采取除检索之外的操作的意义这些方法应该被认为是“安全的”。

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

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

通常,视图还会检查用户是否被授权这样做:例如,如果仅允许对象的“所有者”删除此类项目,则视图应对此进行验证。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章