404 при использовании `redirect` и` url_for` в flask - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь проверить перенаправления в flask. Я могу go напрямую к конечной точке URL без проблем, но когда я пытаюсь перенаправить на нее, я получаю сообщение об ошибке.

Редактировать: я изменил имя метода, вызова и URL-адреса на «прогнозирование», но все еще получаю ту же ошибку.

Вот так выглядит мой код

from flask import Flask, request, render_template, jsonify
from flask_ngrok import run_with_ngrok
from flask import redirect, url_for

app = Flask(__name__)
run_with_ngrok(app)

@app.route('/QueryParser', methods=['GET', 'POST'])
def query():

    if request.method == 'GET':
        return render_template('index.html', value='hi')
    else:
        body = request.get_json()

        question_textN = body['question']
        context_textN = body['context']

        return redirect(url_for('predict', question=question_textN, 
                        context=context_textN))

@app.route("/predict/<question>/<context>", methods=["GET"])
def predict(question, context):

    question_text = question
    context_text = context

    return jsonify(answer=question_text, context=context_text)

if __name__=="__main__":
    app.run()

В данном конкретном случае он работает на

http://688adffe.ngrok.io/QueryParser

Когда я вставляю контекст и запрос и нажимаю «спросить», ничего не происходит, и я вижу это в выводе моей командной строки

 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Running on http://688adffe.ngrok.io
 * Traffic stats available on http://127.0.0.1:4040
127.0.0.1 - - [21/Feb/2020 03:51:48] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [21/Feb/2020 03:51:48] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [21/Feb/2020 03:51:55] "GET /QueryParser HTTP/1.1" 200 -
127.0.0.1 - - [21/Feb/2020 03:52:01] "POST / HTTP/1.1" 404 -

Это работает очень хорошо, если я go прямо на URL

http://688adffe.ngrok.io/predict/test1/test2

Я получаю это в выводе командной строки

127.0.0.1 - - [21/Feb/2020 02:07:28] "GET /ModelInference/test1/test2 HTTP/1.1" 200 -

И есть вывод (хотя я стремился передать вывод в html, но об этом я могу беспокоиться позже)

{
  "answer": "test1", 
  "context": "test2"
}

Чтобы воссоздать минимальный пример, используйте этот код, который загружает файлы с моего диска Google. Обратите внимание, что flask версии выше 1.0 иногда не работают с flask_ngrok. В некоторых случаях работает только версия 0.12.5 или 0.12.4.

!pip install flask==1.0
!pip install flask-ngrok
import os
if not os.path.exists('templates'):
    os.mkdir('templates')

%cd templates
!gdown --id 1-l3SlwyyNjSV-bzUnyw1ZpPaPQz3KUYP
%cd ..
!gdown --id 1s_lGCf_T0619RWZKBjQ_oES0jwmNSn2F

!python rest-testMin.py

Для удобства вот ссылка на Google Colab, в которой этот код готов к выполнению

https://colab.research.google.com/drive/1uxbR0-c75njIq5dckSpKVaklZkrTb4kf

1 Ответ

1 голос
/ 21 февраля 2020

Первый аргумент url_for должен быть именем функции представления. Это должно быть

return redirect(url_for('predict', question=question_textN, context=context_textN))

Из Документов

flask .url_for (конечная точка, ** значения)

Создает URL-адрес для указанной конечной точки с помощью предоставленного метода.

Кроме того,

С вашего сервера выводит

127.0.0.1 - - [21/Feb/2020 03:52:01] "POST / HTTP/1.1" 404 -

Кажется, что вы неправильно установлен атрибут формы action, указывающий на функцию представления запроса.

<form method="post" action="{{url_for('query')}}">
...
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...