2014-09-20 64 views
2

我正在使用燒瓶框架,似乎無法從數據庫中刪除行。下面的代碼給出了一個405錯誤:「該方法不允許用於請求的URL。」有任何想法嗎?使用python燒瓶刪除數據庫中的行?

在潘岳:

@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> 

回答

0

在HTML一個簡單的<a href=鏈接提交GET請求,但你的路線只允許PUT請求。

<a>不支持PUT請求。 您必須使用表單和/或JavaScript代碼提交請求。 (請參閱Make a link use POST instead of GET。)

3

單擊<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> 

這裏是如何做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意味着是冪等的(可以反覆運行並且不執行破壞性操作)。 Here's a question與一些更多的細節。

+0

選項1有點不錯。但唯一的問題是當日志記錄...它不顯示爲DELETE,但POST ... – user805981 2016-03-20 04:47:26

2

或者,將POST更改爲DELETE以啓動您。

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

理想情況下,您應該使用HTTP DELETE方法。

+0

這裏有一些原因,爲什麼GET不應該用於修改數據:http://stackoverflow.com/questions/705782/ why-shouldnt-data-be-modified-on-http-get-request – 2014-09-20 23:19:41

+0

@迷失理論我學會了。更新了我的答案。 – chfw 2014-09-21 08:42:17

+0

@chfw這不適用於表格 – user805981 2016-03-20 04:46:36

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