При запуске gunicorn контекст приложения фляги не появляется в конце запроса - PullRequest
0 голосов
/ 02 октября 2019

Я работаю над приложением для фляги и нахожусь в процессе его установки на внешнем сервере. Я настроил его для работы с gunicorn и nginx. Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь вводит данные в приложение, он не может получить постоянный доступ к информации (т. Е. После регистрации пользователя приложение распознает его регистрационную информацию только 1 из каждых 5 или 6 раз).

После копания в нем, я думаю, проблема в том, что сессия db никогда не удаляется в конце запроса. Похоже, что flask не отображает контекст приложения в конце запроса. Но я не уверен, почему или как это исправить.

Я предпринял следующие шаги по устранению неполадок: 1) проверенная информация попадает в базу данных - да 2) запустите flask devсервер локально с настройками производственного конфига - работает нормально. 3) запустить gunicorn на локальной машине - я сделал это и испытал те же проблемы с несогласованным доступом к данным 4) уменьшить количество работников gunicorn с 4 до 1 - я сделал это и доступ пользователя db работал корректно 5) проверить, что удаляет flask-sqlalchemyсеанс в конце запроса - обнаружил, что функция не вызывает db.session.remove при запуске gunicorn. 6) Проверьте, что app.do_teardown_appcontext вызывался - не вызывался при запуске gunicorn. Он вызывается при запуске сервера dev. 7) Убедитесь, что appcontext pop вызывается в конце запроса - нет, не вызывается при запуске gunicorn. Да, вызывается при запуске сервера dev. 8) проверить вызываемый pop контекст запроса - да для обоих.

Flask config.py

 class Config(object):
    SQLALCHEMY_DATABASE_URI =  os.environ.get('DATABASE_URL')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class ProductionConfig(Config):
    DEBUG = False
    TESTING = False

class DevelopmentConfig(Config):
    DEBUG = True
    TESTING = False

** init .py

def register_extensions(app):
    """Register extension with app."""
    db.init_app(app)
    migrate.init_app(app, db)
    login.init_app(app)

def create_app(configClass=None):
    app = Flask(__name__)
    if configClass is None:
        if app.config['ENV'] == 'production':
            app.config.from_object(config.ProductionConfig)
        else:
            app.config.from_object(config.DevelopmentConfig)
    else:
        app.config.from_object(configClass)
   #app.app_context().push()
   register_extensions(app)
   register_blueprints(app)
   return app

Конфигурация супервизора

[program:Ask]
command=/home/ubuntu/project/venv/bin/gunicorn -b localhost:8000 -w 
4 Ask:app
directory=/home/ubuntu/project
user=ubuntu
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

разрыв вызовов при запуске сервера dev: Функции разрыва: [.shutdown_session at 0x7f55df9718c0>] контекст запросаpop называется req context pop вызывающее приложение делает запрос на разрыв приложения контекст pop pop вызывает приложение вызывает вызов teardown appcontext вызывает вызов teardown appcontext вызывается, вызов вызывается teardown appcontext func вызывает вызов сеанса завершения сеанса вызывается удалить

разрывается вызовы прис помощью gunicorn Функций разрыва: [.shutdown_session at 0x7f0dfa579440>] контекст запроса pop называется req context pop вызывающее приложение делает запрос разрыва

Update

Я нашел решениеудалял app.app_context (). push () из функции create_app. Первоначально я добавил это, чтобы выдвинуть контекст приложения, чтобы несколько списков выбора форм имели возможность доступа к БД для автоматического заполнения. Чтобы убрать толчок контекста приложения, я переместил вызовы, чтобы заполнить списки выбора форм для моих представлений. Это соответствует рекомендациям по документации колб в отношении использования контекста приложения. https://flask.palletsprojects.com/en/1.1.x/appcontext/

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