使用python烧瓶从数据库中删除行?

Posted

技术标签:

【中文标题】使用python烧瓶从数据库中删除行?【英文标题】:Deleting rows from database with python flask? 【发布时间】:2014-11-14 20:03:08 【问题描述】:

我正在使用烧瓶框架,似乎无法从数据库中删除行。下面的代码给出了 405 错误:“请求的 URL 不允许该方法。”有什么想法吗?

在py中:

@app.route('/delete/<postID>', methods=['POST'])
def delete_entry():
    if not session.get('logged_in'):
        abort(401)
    g.db.execute('delete from entries WHERE id = ?', [postID])
    flash('Entry was deleted')
    return redirect(url_for('show_entries', post=post))

html中:

<a href="/delete/ entry.id "><h3>delete</h3></a>

【问题讨论】:

【参考方案1】:

我使用flaskr 作为我的 Flask 项目的基础(看起来你也是这样做的)。

在.py中:

@app.route('/delete', methods=['POST'])
def delete_entry():
if not session.get('logged_in'):
    abort(401)
g.db.execute('delete from entries where id = ?', [request.form['entry_id']])
g.db.commit()
flash('Entry deleted')
return redirect(url_for('show_entries'))

在 HTML 中:

<form action=" url_for('delete_entry') " method=post class=delete-entry>
    <input type="hidden" name="entry_id" value=" entry.id ">
    <input type="submit" value="Delete" />
</form>

我想要一个按钮,但您可以轻松地使用带有解决方案 here 的链接。

【讨论】:

【参考方案2】:

或者,将 POST 更改为 DELETE 以让您继续。

@app.route('/delete/<postID>', methods=['DELETE'])

理想情况下,您应该使用 HTTP DELETE 方法。

【讨论】:

以下是为什么不应该使用 GET 来修改数据的一些原因:***.com/questions/705782/… @user805981,在这个问题中为真:***.com/questions/5162960/…。您将使用 ajax 来发出“删除”,而不是使用表单方法本身。【参考方案3】:

点击&lt;a href...&gt;delete&lt;/a&gt;会发出GET请求,而你的delete_entry方法只响应POST。

您需要 1. 将链接替换为表单和提交按钮,或者 2. 让链接使用 javascript 提交隐藏表单。

这里是如何做1:

<form action="/delete/ entry.id " method="post">
    <input type="submit" value="Delete />
</form>

这里是如何做 2(使用 jQuery):

$(document).ready(function() 
    $("a.delete").click(function() 
        var form = $('<form action="/delete/' + this.dataset.id + '" method="post"></form>');
        form.submit();
    );
);

...

<a href="#delete" class="delete" data-id=" entry.id ">Delete</a>

您应该做的一件事是让您的 delete_entry 方法响应 GET。 GET 意味着幂等(可以安全地重复运行并且不执行破坏性操作)。 Here's a question 提供更多详细信息。

【讨论】:

选项 1 不错。但唯一的问题是在记录时...它不会将其显示为 DELETE 而是 POST...【参考方案4】:

HTML 中的简单&lt;a href= 链接提交GET 请求,但您的路由只允许PUT 请求。

&lt;a&gt; 不支持PUT 请求。 您必须使用表单和/或 JavaScript 代码提交请求。 (见Make a link use POST instead of GET。)

【讨论】:

以上是关于使用python烧瓶从数据库中删除行?的主要内容,如果未能解决你的问题,请参考以下文章

如何从烧瓶网页在 python 控制台中打印数据

时区在 python 烧瓶中被删除

如何从烧瓶中的“ImmutableMultiDict”获取数据

从 Python 烧瓶 API 返回空白

如何将数据从烧瓶发送到 html 模板

从烧瓶应用程序调用 python 函数