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.

Importación circular al usar Flask-Mail en un proyecto Flask-Restful.

Estoy trabajando en un proyecto Flask que incluye el envío de enlaces de confirmación por correo electrónico. Sin embargo, al usar flask-restful, hay un problema de importación circular de módulos.

En mi archivo app.py, he importado módulos y utilizo api.add_resource.
“`

<h1>Archivo app.py</h1>

from flask<em>restful import Api
from flask import Flask
from account import Register
from flask</em>mail import Mail

app = Flask(<strong>nombre</strong>)
app.config['SQLALCHEMY<em>DATABASE</em>URI'] = ''
app.config['SQLALCHEMY<em>TRACK</em>MODIFICATIONS'] = False
app.config.from_pyfile('core/config.py')

mail = Mail(app)
api = Api(app)

api.add_resource(Register, '/register')

if <strong>nombre</strong> == '<strong>principal</strong>':
app.run(debug=True)
“`

En mi archivo account.py, necesito enviar un correo electrónico para cada solicitud POST de esta manera:

from app import mail
class Register(Resource):
# init some msg and configuration
mail.send(msg)

Ahora, esto es una importación circular, ya que app.py importa account.py y account.py importa app.py para usar mail. ¿Alguien tiene alguna solución para este problema sin abandonar el uso del módulo flask-restful?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución es mover api.add_resource y ejecutar app a un archivo separado, por ejemplo, run.py. Este archivo importaría tanto el módulo app como el módulo cuenta para inicializar y ejecutar la aplicación.

    Por ejemplo, en run.py:

    from app import app, api
    from account import Register
    
    api.add_resource(Register, '/register')
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    Y en account.py:

    from app import mail
    
    class Register(Resource):
        # inicializar algún mensaje y configuración
        mail.send(msg)
    

    Esto elimina la importación circular ya que account.py ya no importa directamente a app.py, sino indirectamente a través de run.py.

    Otra solución es usar una extensión de Flask para enviar correos electrónicos, como Flask-Mail. De esta manera, se evita la necesidad de importar mail de app y el problema de la importación circular en su totalidad.

    Por ejemplo, en app.py:

    from flask_restful import Api
    from flask import Flask
    from flask_mail import Mail
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = ''
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config.from_pyfile('core/config.py')
    
    mail = Mail(app)
    api = Api(app)
    
    if __name__ == '__main__':
        api.add_resource(Register, '/register') # Movido a run.py
        app.run(debug=True)
    

    Y en account.py:

    from flask_mail import Message
    from flask_restful import Resource
    from app import mail
    
    class Register(Resource):
        # inicializar algún mensaje y configuración
        msg = Message('Correo de confirmación', recipients=[email])
        mail.send(msg)
    

    Con Flask-Mail, simplemente se importa la clase Message y se utiliza mail.send() para enviar mensajes de correo electrónico. Esto es más simple y modular que importar mail de app, y no causa importaciones circulares con Flask-RESTful.

Comments are closed.