es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    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 "esto es una prueba"
    
    if __name__ == "__main__":
        bot_thread = Thread(target=start_bot, args=(app,))
        bot_thread.start()
        app.run()
    

    Modificado bot.py:

    from time import time, sleep
    from models import db
    from models import User
    from flask import Flask
    
    def access_db(app):
        with app.app_context():
            all_usrs = User.query.all()
        return (str(all_usrs))
    
    def start_bot(app):
        with app.app_context():
            while True:
                print(f"Hora actual: {time()}")
                sleep(3)
                access_db(app)
    

    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 en Thread (target=start_bot, args = (app,)).

Comments are closed.