Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在应用程序上下文中运行芹菜工人仍然会引发;“在应用程序上下文之外工作”;任务中的错误_Python_Flask_Celery - Fatal编程技术网

Python 在应用程序上下文中运行芹菜工人仍然会引发;“在应用程序上下文之外工作”;任务中的错误

Python 在应用程序上下文中运行芹菜工人仍然会引发;“在应用程序上下文之外工作”;任务中的错误,python,flask,celery,Python,Flask,Celery,我用app-factory模式设置芹菜,以便用Flask-Mail发送电子邮件。我一直在调用各种使用芹菜的脚本,没有任何问题。但是,我不断遇到运行时错误:在应用程序上下文之外执行以下任务,即使我正在应用程序上下文中运行worker。为什么我会犯这个错误?我怎样才能在芹菜厂工作 email.py: from flask import current_app, render_template from flask.ext.mail import Message from . import celer

我用app-factory模式设置芹菜,以便用Flask-Mail发送电子邮件。我一直在调用各种使用芹菜的脚本,没有任何问题。但是,我不断遇到
运行时错误:在应用程序上下文之外执行以下任务,即使我正在应用程序上下文中运行worker。为什么我会犯这个错误?我怎样才能在芹菜厂工作

email.py

from flask import current_app, render_template
from flask.ext.mail import Message
from . import celery, mail

@celery.task
def send_async_email(msg):
    mail.send(msg)

def send_email(to, subject, template, **kwargs):
    with current_app.test_request_context(): # used app_context() as well.
        msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +                                       subject,
                  sender=current_app.config['PORTAL_MAIL_SENDER'], recipients=[to])
        msg.body = render_template(template + '.txt', **kwargs)
        msg.html = render_template(template + '.html', **kwargs)
        send_async_email.delay(msg)
from flask import Flask
from celery import Celery
from flask.ext.mail import Mail
from configuration import config

mail = Mail()
celery = Celery(__name__, broker=config['default'].CELERY_BROKER_URL)

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    mail.init_app(app)
    celery.conf.update(app.config)
    app.register_blueprint(main_blueprint)
    return app
import os
from app import celery, create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
app.app_context().push()
from flask import render_template, current_app
from flask.ext.mail import Message
from . import celery, mail, create_app


@celery.task
def send_async_email(msg):
    app = create_app('default' or 'development')  # -> fixed
    with app.app_context():
        mail.send(msg)


def send_email(to, subject, template, **kwargs):
    app = current_app._get_current_object()
    msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +     subject,
    sender=current_app.config['MAIL_USERNAME'], recipients=[to])
    msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    send_async_email.delay(msg)
\uuuu init\uuuuu.py

from flask import current_app, render_template
from flask.ext.mail import Message
from . import celery, mail

@celery.task
def send_async_email(msg):
    mail.send(msg)

def send_email(to, subject, template, **kwargs):
    with current_app.test_request_context(): # used app_context() as well.
        msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +                                       subject,
                  sender=current_app.config['PORTAL_MAIL_SENDER'], recipients=[to])
        msg.body = render_template(template + '.txt', **kwargs)
        msg.html = render_template(template + '.html', **kwargs)
        send_async_email.delay(msg)
from flask import Flask
from celery import Celery
from flask.ext.mail import Mail
from configuration import config

mail = Mail()
celery = Celery(__name__, broker=config['default'].CELERY_BROKER_URL)

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    mail.init_app(app)
    celery.conf.update(app.config)
    app.register_blueprint(main_blueprint)
    return app
import os
from app import celery, create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
app.app_context().push()
from flask import render_template, current_app
from flask.ext.mail import Message
from . import celery, mail, create_app


@celery.task
def send_async_email(msg):
    app = create_app('default' or 'development')  # -> fixed
    with app.app_context():
        mail.send(msg)


def send_email(to, subject, template, **kwargs):
    app = current_app._get_current_object()
    msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +     subject,
    sender=current_app.config['MAIL_USERNAME'], recipients=[to])
    msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    send_async_email.delay(msg)
芹菜\u worker.py

from flask import current_app, render_template
from flask.ext.mail import Message
from . import celery, mail

@celery.task
def send_async_email(msg):
    mail.send(msg)

def send_email(to, subject, template, **kwargs):
    with current_app.test_request_context(): # used app_context() as well.
        msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +                                       subject,
                  sender=current_app.config['PORTAL_MAIL_SENDER'], recipients=[to])
        msg.body = render_template(template + '.txt', **kwargs)
        msg.html = render_template(template + '.html', **kwargs)
        send_async_email.delay(msg)
from flask import Flask
from celery import Celery
from flask.ext.mail import Mail
from configuration import config

mail = Mail()
celery = Celery(__name__, broker=config['default'].CELERY_BROKER_URL)

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    mail.init_app(app)
    celery.conf.update(app.config)
    app.register_blueprint(main_blueprint)
    return app
import os
from app import celery, create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
app.app_context().push()
from flask import render_template, current_app
from flask.ext.mail import Message
from . import celery, mail, create_app


@celery.task
def send_async_email(msg):
    app = create_app('default' or 'development')  # -> fixed
    with app.app_context():
        mail.send(msg)


def send_email(to, subject, template, **kwargs):
    app = current_app._get_current_object()
    msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +     subject,
    sender=current_app.config['MAIL_USERNAME'], recipients=[to])
    msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    send_async_email.delay(msg)
错误:

C:\Python27\Scripts\celery.exe worker -A celery_worker.celery --loglevel=info

[2015-09-30 12:07:34,408: INFO/MainProcess] Received task: app.email.send_async_email[3ec772ff-4767-49cb-90ba-445629da30da]
[2015-09-30 12:07:34,417: ERROR/MainProcess] Task app.email.send_async_email[3ec772ff-4767-49cb-90ba-445629da30da] raised unexpected: RuntimeError('working outside of application context',)
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\celery\app\trace.py", line 240, in trace_task
    R = retval = fun(*args, **kwargs)
  File "C:\Python27\lib\site-packages\celery\app\trace.py", line 438, in __protected_call__
    return self.run(*args, **kwargs)
  File "<flask_project_path>\app\email.py", line 10, in send_async_email
    mail.send(msg)
  File "C:\Python27\lib\site-packages\flask_mail.py", line 491, in send
    with self.connect() as connection:
  File "C:\Python27\lib\site-packages\flask_mail.py", line 508, in connect
    return Connection(app.extensions['mail'])
  File "C:\Python27\lib\site-packages\werkzeug\local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
  File "C:\Python27\lib\site-packages\werkzeug\local.py", line 297, in _get_current_object
    return self.__local()
  File "C:\Python27\lib\site-packages\flask\globals.py", line 34, in _find_app
    raise RuntimeError('working outside of application context')
RuntimeError: working outside of application context
C:\Python27\Scripts\celery.exe worker-A celery\u worker.celery--loglevel=info
[2015-09-30 12:07:34408:INFO/MainProcess]收到的任务:应用程序电子邮件发送异步电子邮件[3ec772ff-4767-49cb-90ba-445629da30da]
[2015-09-30 12:07:34417:错误/MainProcess]任务应用程序电子邮件发送异步电子邮件[3ec772ff-4767-49cb-90ba-445629da30da]引发意外错误:运行时错误('在应用程序上下文之外工作',)
回溯(最近一次呼叫最后一次):
文件“C:\Python27\lib\site packages\celery\app\trace.py”,第240行,在trace\u任务中
R=retval=fun(*args,**kwargs)
文件“C:\Python27\lib\site packages\芹菜\app\trace.py”,第438行,在受保护的调用中__
返回self.run(*args,**kwargs)
发送异步电子邮件中第10行的文件“\app\email.py”
邮件发送(msg)
文件“C:\Python27\lib\site packages\flask\u mail.py”,第491行,在send中
使用self.connect()作为连接:
文件“C:\Python27\lib\site packages\flask\u mail.py”,第508行,在connect中
返回连接(应用程序扩展['mail'])
文件“C:\Python27\lib\site packages\werkzeug\local.py”,第338行,在\uuu getattr中__
返回getattr(self.\u get\u current\u object(),name)
文件“C:\Python27\lib\site packages\werkzeug\local.py”,第297行,在\u get\u current\u对象中
返回self.\uuu local()
文件“C:\Python27\lib\site packages\flask\globals.py”,第34行,在_find_app中
引发运行时错误('在应用程序上下文之外工作')
运行时错误:在应用程序上下文之外工作
我试过:

  • 正在尝试将应用程序上下文传递给send_电子邮件方法
  • 将send_async_email方法移动到tasks.py模块,我的芹菜任务的其余部分就在该模块中
  • 在email方法之外呈现模板并将其作为参数传递

我通过在本地创建flask应用程序的实例,解决了这个问题:

email.py

from flask import current_app, render_template
from flask.ext.mail import Message
from . import celery, mail

@celery.task
def send_async_email(msg):
    mail.send(msg)

def send_email(to, subject, template, **kwargs):
    with current_app.test_request_context(): # used app_context() as well.
        msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +                                       subject,
                  sender=current_app.config['PORTAL_MAIL_SENDER'], recipients=[to])
        msg.body = render_template(template + '.txt', **kwargs)
        msg.html = render_template(template + '.html', **kwargs)
        send_async_email.delay(msg)
from flask import Flask
from celery import Celery
from flask.ext.mail import Mail
from configuration import config

mail = Mail()
celery = Celery(__name__, broker=config['default'].CELERY_BROKER_URL)

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    mail.init_app(app)
    celery.conf.update(app.config)
    app.register_blueprint(main_blueprint)
    return app
import os
from app import celery, create_app

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
app.app_context().push()
from flask import render_template, current_app
from flask.ext.mail import Message
from . import celery, mail, create_app


@celery.task
def send_async_email(msg):
    app = create_app('default' or 'development')  # -> fixed
    with app.app_context():
        mail.send(msg)


def send_email(to, subject, template, **kwargs):
    app = current_app._get_current_object()
    msg = Message(current_app.config['PORTAL_MAIL_SUBJECT_PREFIX'] + ' ' +     subject,
    sender=current_app.config['MAIL_USERNAME'], recipients=[to])
    msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    send_async_email.delay(msg)