Flask возврат перенаправления не работает после удаления - PullRequest
1 голос
/ 08 марта 2020

Помогите, я новичок в FLask и Python. Я не уверен, почему, но обратный редирект не работает. Когда я нажимаю кнопку, элемент удаляется, но он не перенаправляет и не отправляет сообщение. Если я щелкну домой после этого, сообщение об успехе будет мигать.

@app.route('/stuff/<thing_id>', methods=['DELETE'])
def delete_thing(thing_id):
  error = False
  thing = thing.query.filter(thing.id == thing_id).one_or_none()
  if thing is None:
    return render_template('errors/404.html')
  try:
    db.session.delete(thing)
    db.session.commit()
  except:
    error = True
    flash('An error occurred. thing ' + thing.name + ' could not be deleted.')
    db.session.rollback()
    print(sys.exc_info())
  finally:
    db.session.close()
  if not error:
    flash('thing ' + thing.name + ' was successfully deleted!')
  return redirect(url_for('index'))

В моем шаблоне у меня есть:

<button id="delete-thing" data-id="{{ thing.id }}" class="btn btn-default btn-sm">
    Delete Thing
</button>

<script>
    const deleteBtn = document.getElementById('delete-thing')
    deleteBtn.onclick = function(e) {
        let result = confirm("Are you sure? This will permanently delete this thing!");
        if (result) {
            const thingId = e.target.dataset['id']
            fetch('/stuff/' + thingId, {
                method: 'DELETE'
            })
        }
    }
</script>

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 08 марта 2020

Эта javascript функция извлечения выполняет так называемый ajax вызов. Это означает, что он вызовет сервер и извлечет результат, а затем сделает то, что вам говорят И вы ничего не сказали, поэтому он ничего не делает с возвращаемым значением. Вот почему ничего не происходит, когда вы нажимаете кнопку.

Но ваш код сервера устанавливает сообщение fla sh, и оно будет показано в следующий раз, когда вы действительно загрузите любую страницу с сервера.

Как это исправить? Ну, это в значительной степени зависит от вашего ожидаемого рабочего процесса. Я сам рассматриваю возможность использования ajax для вызова продвинутых топи c. Ajax звонки лучше подходят для SPA (одностраничные приложения). Я бы порекомендовал вам go для традиционного способа, используя старые добрые html формы с методом POST. Как только вы ознакомитесь с этим, вы сможете продвигаться вперед. В любом случае, это скорее вопрос javascript, чем python / flask / sqlalchemy, потому что эта часть верна с вашей стороны.

В любом случае, чтобы вы увидели, что происходит, вы можете попробовать что-то вроде этого:

        fetch('/stuff/' + thingId, {
            method: 'DELETE'
        }).then(function(response) {
            if (!response.ok) {
                console.log("Error", response);
            } else {
                console.log("Success", response);
                // this is kind-of silly, but should help you achieve what you want
                // location.reload()
            }
        })

И запустите консоль вашего веб-браузера, чтобы увидеть отладочные отпечатки. См .: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...