Cómo ejecutar adecuadamente un bot con una aplicación web de Flask.
El objetivo es ejecutar un script de bot con varios archivos que necesitan compartir la base de datos con la aplicación web Flask.
models.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100))
passhash = db.Column(db.String(1000))
app.py
from flask import Flask
from models import db, User
from test import start_bot
from threading import Thread
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///sth.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)
@app.route('/')
def get_info():
return "this is a test"
if __name__ == "__main__":
bot_thread = Thread(target=start_bot).start()
app.run()
bot.py este es el archivo principal del bot simplificado a un solo archivo
“`
from time import time,sleep
from models import db
from models import User
def access_db():
all_users = User.query.all()
return (str(all_users))
def start_bot():
while True:
print(f”Current Time : {time()}”)
sleep(3)
access_db()
Ahora el bot necesita acceder a la base de datos y devolver una lista de todos los usuarios en esa base de datos, y también necesita editar, agregar o eliminar de esa base de datos.
El error
RuntimeError: No se encontró ninguna aplicación. Trabaja dentro de una función de vista o empuja un contexto de aplicación. Ver http://flask-sqlalchemy.pocoo.org/contexts/.
el bot parece estar fuera del contexto de la aplicación. Intenté ejecutar el subproceso utilizando withapp.app_context():
, pero esto no parece resolver el problema.
¿Cómo solucionar dicho problema?
davy.ai
Para resolver este problema, puedes pasar el objeto de la aplicación a la función start_bot y crear un nuevo contexto de aplicación para acceder a la base de datos dentro de la función.
Modificado
app.py
:Modificado
bot.py
:Ten en cuenta que creamos un nuevo contexto de aplicación dentro de las funciones access_db y start_bot usando
with app.app_context ():
. También pasamos el objeto de la aplicación a la función start_bot y a la función access_db a través del parámetro args enThread (target=start_bot, args = (app,))
.