使用Python Flask从数据库中删除行?

4
我是一名有帮助的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在使用flask框架,但无法从数据库中删除行。下面的代码会出现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>
4个回答

4
点击<a href...>delete</a>将发起一个GET请求,而您的delete_entry方法仅响应POST请求。您需要采取以下措施之一:1. 用表单和提交按钮替换链接,或2. 使用JavaScript提交隐藏表单。以下是如何执行第1步的方法:
<form action="/delete/{{ entry.id }}" method="post">
    <input type="submit" value="Delete />
</form>

Here's how to do 2 (with 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请求应该是幂等的(可以重复运行而不执行破坏性操作)。这里是一个问题,其中包含更多细节。


选项1还不错,但唯一的问题是在记录时...它显示为POST而不是DELETE... - user805981

2

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

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

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

以下是一些不应该使用GET方法修改数据的原因:https://dev59.com/2HRB5IYBdhLWcg3wJUeu - Steven Kryskalla
@user805981,这里的true指的是这个问题中提到的:https://dev59.com/dm435IYBdhLWcg3w4UMb。你可以使用ajax来发出“delete”请求,而不是直接使用表单方法。 - chfw

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>

我想要一个按钮,但你可以很容易地使用解决方案这里中的链接。


0

在HTML中,一个简单的<a href=链接会提交一个GET请求,但是你的路由只允许PUT请求。

<a>不支持PUT请求。 你必须使用表单和/或JavaScript代码来提交请求。 (参见使链接使用POST而不是GET。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接