使用 gevent 在应用程序上下文之外工作的 Flask 蓝图

2024-05-03

我正在尝试通过 Flask-mail 使用 gevent 在 Flask 中异步发送电子邮件。我正在“在应用程序上下文之外工作”。我知道 app.app_context() 但我无法让它与我的设置一起使用。

我的应用程序是使用这样的应用程序工厂创建的:

我的项目/run_dev.py

from gevent.wsgi import WSGIServer
from my_project.app import create_app
from my_project.config import DevConfig

app = create_app(DevConfig)
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

我的项目/我的项目/app.py

def create_app(config=None, app_name=None, blueprints=None):
    app = Flask(app_name)
    configure_app(app, config)
    <other stuff>
    return app

以及我用来发送电子邮件的代码:

myproject/myproject/mymodule/views.py

@mymodule.route('/some/path/')
def do_something():
    do_stuff(something)

myproject/myproject/mymodule/utils.py

def do_stuff(something):
    send_email(msg)

@async
def send_async_email(msg):
    mail.send(msg)

def send_mail(request_id, recipients, email_type, env=None, pool=None):
    msg = Message(
        sender=sender,
        recipients=recipients,
        subject=subject,
        body=body)
    send_async_email(msg)

myproject/myproject/decorators.py

def async(f):
    def wrapper(*args, **kwargs):
        t = Greenlet.spawn(f, *args, **kwargs)
        gevent.joinall([t])
    return wrapper

我尝试添加:

from myproject.app import create_app
app = create_app()
with app.app_context():
    mail.send(msg)

到 send_async_email() 但后来我得到

导入错误:无法导入名称 create_app


出于历史目的:将from myproject.app import create_app在 - 的里面send_async_email而不是在顶部与其余导入一起解决了 ImportError,因为它导致了循环依赖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gevent 在应用程序上下文之外工作的 Flask 蓝图 的相关文章

随机推荐