Приложение Flask на uwsgi выдает ошибку TypeError: объект Flask не повторяется
Я использую приложение Python/Flask на Python 3.5 в virtualenv на Arch Linux. Приложение запускается сервером uwsgi, который подключен через сокет к Nginx.
Когда я выполняю запрос, я получаю следующую ошибку uwsgi:
Mar 23 02:38:19 saltminion1.local uwsgi[20720]: TypeError: 'Flask' object is not iterable
Это вызываемая функция, которую uwsgi настроил на использование:
def create_app(config=None, import_name=None):
if import_name is None:
import_name = DefaultConfig.PROJECT
app = Flask(import_name, instance_path=INSTANCE_FOLDER_PATH, instance_relative_config=True)
configure_app(app, config)
configure_database(app)
configure_logging(app)
configure_error_handlers(app)
configure_blueprints(app)
return app
Все работает хорошо, когда я запускаю приложение, используя встроенный HTTP-сервер, как на локальной рабочей станции OS X, так и на бродячих блоках Arch/Ubuntu.
Проблема: после добавления отладочных операторов стало ясно, что ошибка возникает в какой-то момент в самом коде Flask, а не в моем приложении. Как я могу получить трассировку стека здесь для устранения неполадок лучше?
2 ответа
Приложение WSGI (которым является Flask) - это вызываемый объект. Вот что uWSGI ожидает передать callable
, Вы передаете фабрику приложений, которая также может быть вызвана, но вам нужно передать ее в результате этого вызова, потому что фабрика приложений не является приложением WSGI.
Заводская функция может быть вызвана непосредственно в конфигурации. module
а также callable
Варианты также могут быть объединены в просто module
,
module = my_app:create_app()
Это говорит uWSGI для импорта my_app
, находить my_app.create_app
и позвони. Результатом этого является приложение Flask, которое фактически используется в качестве вызываемого.
Нашел ответ: я настроил uwsgi с callable = create_app
которая была функцией, которая возвращает Flask "приложение". Но на самом деле uwsgi хочет объект приложения.