我正在尝试使用此功能安排从我的烧瓶应用程序发送电子邮件:
from apscheduler.scheduler import Scheduler
scheduler = Scheduler()
scheduler.start()
def email_job_scheduling():
to="abdellah.ala@gmail.com"
subject="summary projects"
message="your summary projects"
send_email(to,subject,message)
scheduler.add_cron_job(email_job_scheduling, day_of_week='tue', hour=12, minute=55)
这是我在文件 init .py中声明应用程序的方式,是否存在任何关系,或者必须在此文件中添加计划功能。
login_manager = LoginManager()
db = SQLAlchemy()
mail = Mail()
def create_app(config_name):
app = Flask(__name__, instance_relative_config=True)
app.config.from_object(app_config[config_name])
app.config.from_pyfile('config.py')
app.permanent_session_lifetime = timedelta(minutes=10)
db.init_app(app)
mail.init_app(app)
login_manager.init_app(app)
return app
但是我收到此错误,
调试模式:关闭*在http://127.0.0.1:5000/上运行(按CTRL + C 退出)作业“ email_job_scheduling(触发:cron [day_of_week ='wed', hour ='9',minutes = '57'],下次执行:2019-12-11 09:57:00)“提出了 异常回溯(最近一次呼叫最近):文件 “ /home/abdellah/Documents/venv/lib64/python3.6/site-packages/apscheduler/scheduler.py”, 第512行,在_run_job中 retval = job.func(* job.args,** job.kwargs)文件“ /home/abdellah/Documents/SUPPORT-STS/project/app/admin/views.py”, 第29行,在email_job_scheduling中 send_email(收件人,主题,消息)文件“ /home/abdellah/Documents/SUPPORT-STS/project/app/emails.py”, 第11行,在send_email中 mail.send(msg)文件“ /home/abdellah/Documents/venv/lib64/python3.6/site-packages/flask_mail.py”, 发送中的第491行 使用self.connect()作为连接:文件“ /home/abdellah/Documents/venv/lib64/python3.6/site-packages/flask_mail.py”, 连接线508 返回Connection(app.extensions ['mail'])文件“ /home/abdellah/Documents/venv/lib64/python3.6/site-packages/werkzeug/local.py”, 第348行,位于 getattr 返回getattr(self._get_current_object(),名称)文件“ /home/abdellah/Documents/venv/lib64/python3.6/site-packages/werkzeug/local.py”, _get_current_object中的第307行 返回self .__ local()文件“ /home/abdellah/Documents/venv/lib64/python3.6/site-packages/flask/globals.py”, _find_app中的第52行 引发RuntimeError(_app_ctx_err_msg)RuntimeError:在应用程序上下文之外工作。
这通常意味着您尝试使用 需要以某种方式与当前应用程序对象接口。 要解决此问题,请使用app.app_context()设置应用程序上下文。 有关更多信息,请参见文档。
答案 0 :(得分:0)
是,如果未指定应用程序上下文,则应创建它。 这是因为有必要在Flask应用程序中定义所有必需的资源。 该文档完美地说明了在哪种情况下以及如何在Flask中使用上下文应用程序。
https://flask.palletsprojects.com/en/1.0.x/appcontext/
如果您发布更多代码,我可能会更有帮助。
我将尝试通过以下方式找到解决方案:
from flask import g
def email_job_scheduling():
a = "abdellah.ala@gmail.com"
subject = "summary projects"
message = "your summary projects"
send_email (to, subject, message)
def get_scheduler():
if "scheduler" is not in g:
g.scheduler = Scheduler()
g.scheduler.start()
returns g.scheduler
with app.app_context(): #add the necessary resources
scheduler = get_scheduler()
#add another code if you need to set another resource
#This piece of code I think is in the main
scheduler.add_cron_job (email_job_scheduling, day_of_week = 'tue', now = 12, minute = 55)