Как избежать ошибки времени выполнения с помощью RQ на Heroku в приложении Flask, содержащем тире

#python #flask #heroku #flask-sqlalchemy #plotly-dash

Вопрос:

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

Поэтому я прочитал, что вы можете использовать RQ , чтобы сделать так, чтобы они запускались в фоновом режиме. Однако, когда я пытаюсь его использовать, я сталкиваюсь с RuntimeError: No application found. Either work inside a view function or push an application context. ошибкой.

Это происходит, когда я пытаюсь сделать следующее из своего views.py файла:

 from rq import Queue
from .worker import conn

q = Queue(connection=conn)

@views.route('/scheduled/run', methods=['GET', 'POST'])
@login_required
def schedule_run():
    from .run_matches import run
    q.enqueue(run)
    return redirect("/scheduled/1")
 

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

Я пытался

   with app.app_context():
      q.enqueue(run)
 

как и предлагалось, когда появилась ошибка, но получить NameError: app is not defined .

Итак, мой __init__.py файл выглядит так:

 from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from os import path
from flask_login import LoginManager

db = SQLAlchemy()
DB_NAME = "database.db"

def create_app():
    app = Flask(__name__)
    app.secret_key = "my_secret_key"
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///{}'.format(DB_NAME)
    db.init_app(app)

    from .views import views
    from .auth import auth

    app.register_blueprint(views, url_prefix='/')
    app.register_blueprint(auth, url_prefix='/')

    from .models import User, Scheduled, Monitoring

    create_database(app)

    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    @login_manager.user_loader
    def load_user(id):
        return User.query.get(int(id))

    from .dash_archive import init_dashboard
    app = init_dashboard(app)

    return app

def create_database(app):
    db.create_all(app=app)
    print('Created Database!')
 

My main.py file looks like the following:

 from website import create_app

app = create_app()

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

The init_dashboard() function in my dash_archive.py file:

 def init_dashboard(server):
    """Create a Plotly Dash dashboard."""
    dash_app = dash.Dash(
        server=server,
        routes_pathname_prefix='/archives/dash_archive/',
        external_stylesheets=[
            '/static/dist/css/styles.css',
            'https://codepen.io/chriddyp/pen/bWLwgP.css'
        ]
    )
    dash_app.layout = html.Div([...])
    return dash_app.server