【问题标题】:Deleting rows from database with python flask?使用python烧瓶从数据库中删除行?
【发布时间】: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>

【问题讨论】:

    标签: python sqlite flask http-status-code-405


    【解决方案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 方法。

      【讨论】:

      【解决方案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。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 2021-02-17
        • 2021-08-28
        • 1970-01-01
        • 2014-07-20
        • 2014-07-28
        • 1970-01-01
        相关资源
        最近更新 更多