Gunicorn вызывает add_url_rule Flask, вызывая 404 - PullRequest
0 голосов
/ 29 апреля 2018

Я использую Gunicorn на Heroku, чтобы пытаться обслуживать основную веб-страницу, и если я использую обычный декоратор маршрута, он работает нормально. Например:

from flask import Flask

app = Flask(__name__)
@app.route('/')
def a():
    return "b"
if __name__ == "__main__":
    app.run()

Этот код будет работать нормально и корректно обслуживать 'b' в индексе. Однако, если вместо использования декоратора маршрута я использую функцию add_url_route, он отвечает только 404.

from flask import Flask

app = Flask(__name__)
def a():
    return "b"
if __name__ == "__main__":
    app.add_url_rule('/', 'index', a)
    app.run()

Вот мой Procfile:

web: gunicorn test:app --log-file=-

Стоит отметить, что когда я запускаю это из командной строки с Python (python test.py), оба работают нормально. Я что-то здесь не так делаю? Я использую Python 3.6.3 и Flask 0.12.2.

1 Ответ

0 голосов
/ 29 апреля 2018

Строка app.add_url_rule выполняется только при непосредственном запуске скрипта python. Когда вы просто импортируете скрипт (это то, что делает gunicorn), тогда маршруты вообще не настраиваются, и любой запрос приведет к 404.

Это также объясняет, почему обе версии работали для вас при локальном выполнении.

Если вы действительно хотите, вы можете переместить app.add_url_rule за пределы основного блока. Я не понимаю, почему вы хотели бы сделать это, однако. Первый пример - путь.

Обратите внимание, что app.run() правильно расположен внутри основного блока и должен оставаться там, даже если вы хотите использовать второй пример.

Примечание: ваши два маршрута не идентичны. Первый - это маршрут с именем a в корневом пути, а второй - маршрут с именем index в корневом пути.

...