Удаление строк из базы данных с помощью Python Flask?

Я использую фреймворк и не могу удалять строки из базы данных. Приведенный ниже код дает ошибку 405: «Метод не разрешен для запрошенного URL». Любые идеи?

В ру:

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

person Hayley van Waas    schedule 20.09.2014    source источник


Ответы (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>

Вот как сделать 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 должны быть идемпотентными (их можно запускать повторно и не выполнять деструктивных действий). Вот вопрос с некоторыми подробностями.

person Steven Kryskalla    schedule 20.09.2014
comment
Вариант 1 неплохой. но проблема только при регистрации ... он не показывает это как DELETE, а POST ... - person user805981; 20.03.2016

Или измените POST на DELETE, чтобы начать работу.

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

В идеале вы должны использовать метод HTTP DELETE.

person chfw    schedule 20.09.2014
comment
Вот несколько причин, по которым GET не следует использовать для изменения данных: stackoverflow.com/questions/705782/ - person Steven Kryskalla; 21.09.2014
comment
@ user805981, верно, как в этом вопросе: stackoverflow.com/questions/5162960/. Вы бы использовали ajax для выдачи 'delete', чем сам метод формы. - person chfw; 21.03.2016

Я использовал 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>

Мне нужна была кнопка, но вы можете легко использовать ссылку с решением здесь.

person fundatillus    schedule 15.05.2016

Простая <a href= ссылка в HTML отправляет GET запрос, но ваш маршрут допускает только PUT запросов.

<a> не поддерживает PUT запросы. Вы должны отправить запрос с формой и / или с кодом JavaScript. (См. Используйте для ссылки POST вместо GET.)

person CL.    schedule 20.09.2014