LINUX.ORG.RU

Не могу подружить Flask и gunicorn

 , ,


0

1

Всем привет,

решил я кое-что написать на python3, не будучи программистом. Точнее — написать на Flask, используя эпичную методичку с хабра.

Долго ли коротко ли, но какое-то веб-приложение у меня получилось и прекрасно работает на локалхосте на встроенной пускалке (flask run). Пускалка при старте заявляет, что она девелоперская, и в проде использовать её нельзя. Поэтому «в проде» решил использовать gunicorn.

Приложение, кстати, вот такое (server.py):

from flask import Flask

app = Flask(__name__)
from app import views

@app.route("/")
def hello():
    return "Hello World!"
if __name__ == "__main__":
    app.run()

Так вот, оно вроде бы запускается и работает, hello world отдаёт, но не более того. Все остальные адреса (типа search) возвращают 404, всех остальных @app.route как будто нет. Но если @app.route добавить сюда же в servers.py, то добавленный путь нормально работает.

Надо полагать, строчка from app import views не работает так, как мне бы этого хотелось. Нашёл похожий вопрос на СО, но строчка импорта у ТС там другая, и ответ мне не подошёл.

Запускаю так:

gunicorn -w 4 server:app

Честно говоря, после некоторого опыта с пыхом зависимость поведения программы от реализации сервера кажется дичью. Мне понятна схема, когда на сервере запускается приложение, ну а тут мне даже предлагали сервер запихнуть в само приложение, когда ковырнул было waitress. Чад и угар девопса делает мне неуютно, помогите~

★★★★

Методичка никому не интересна, покажи лучше весь свой код. А автор вороса на SO — рукожоп, ты тоже. Нигда не юзай кросс-импорты, и если хочешь красиво разнести логику, то тебе нужны блупринты.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от menangen

Наверное, потому что описание механизма блупринтов обычно начинается с «This is ideal for larger application», а у меня маленькая поделка. Блупринты где-то в поделке тоже есть, но я их делал скорее для ознакомления.

А нельзя ли взять и запустить приложение, не переписывая его целиком? Это просто пет-проджект, не хочется на него жизнь класть.

muon ★★★★ ()
Ответ на: комментарий от muon

Можно, я тебе завтра пришлю код, как быстро и без гемора сделать что ты хочешь. Я тока не понял, зачем ты это импортируешь:

from app import views
И что там в этих “views”?

menangen ★★★★★ ()
Ответ на: комментарий от muon
А нельзя ли взять и запустить приложение, не переписывая его целиком?

Самый простой способ - это вынести все твои вьюхи в отдельный модуль, создать функцию-регистратор, в неё передать “app”, и уже в теле регистратора использовать декоратор @app.route, будут функции вьюшек внутри функции регистратора.

Ну, и потом регистратор импортируешь в main.py, где создаёшь экземпляр Flask.

menangen ★★★★★ ()
Последнее исправление: menangen (всего исправлений: 2)
Ответ на: комментарий от muon

Я думал, ты в views импортируешь app из server, ибо только так твой код имел какой-то смысл. Причём там всё равно циклические импорты: views импортируют app из __init__.py, а сам инит импортирует views. Короче паршивый ты туториал нашел. Выбрось это и читай официальную документацию.

У тебя два экземпляра Flask (два app), используется только твой пустой с хеллоувордом, а остальные роуты прибиты к тому, что в app/__init__.py.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 2)
Ответ на: комментарий от menangen

Я у тебя в игноре, или ты просто тупорылый и слепой? ТС уже скинул свой код в ответ мне выше. Он в принципе не втыкает роуты в тот экземпляр, который к коде в ОП.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

У тебя два экземпляра Flask (два app)

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

Занятно, что встроенная пускалка без проблем запускает любой из двух app-ов, а gunicorn на «правильном» app-е стектрейсился. После двадцати минут error-driven кодинга прямо на сервере всё заработало, включая nginx. Теперь осталось всё смержить и поднять elasticsearch, но это уже мелочи.

Взаимоотношения импортов стали намного понятнее. По крайней мере, стало понятно, почему они были такими сложными. Туториал вроде норм, просто я брал отдельные нужные главы (там целая книжка), а пропущенное затыкал стабами и костылями.

В общем, спасибо!

muon ★★★★ ()