python - 如何在包含 Dash 的 Flask 应用程序中使用 Heroku 上的 RQ 避免 RuntimeError
问题描述
我已经在 Heroku 上部署了一个 Web 应用程序,它按我的预期工作,除了有一些请求需要比 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")
我知道在尝试将应用程序上下文发送到队列时需要推送应用程序上下文,但由于我还在 Web 应用程序中运行破折号应用程序,因此我无法确定它需要如何完成。
我努力了
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!')
我的main.py
文件如下所示:
from website import create_app
app = create_app()
if __name__ == '__main__':
app.run()
init_dashboard()
我dash_archive.py
文件中的函数:
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
解决方案
推荐阅读
- serial-port - 提示硬线返回 fcntl:无效参数
- scala - 将scala列表转换为数组
- mesos - 在 Aurora 和 Mesos 上部署 Heron 调度程序文件时如何找到它?
- python - Pythoncom - 如何收听 Outlook 传出消息?
- arduino - 来自 Arduino (ESP8266WiFi) 的 Web2Py GET 请求
- kubernetes - Kubernetes - 用于存储的 EBS
- java - 在jsp页面中单击按钮时调用java方法的最简单方法是什么
- javascript - 如何在 JavaScript 中调用同一类中的函数?
- c# - 拒绝访问 Web 服务器文件
- c# - 带有 xamarin 文件夹的图像