#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