使用Python Flask应用程序“ RuntimeError:在应用程序上下文之外工作”(使用调度程序发送gmail)

时间:2019-01-31 04:45:31

标签: python flask apscheduler

app = Flask(__name__)

app.config.update(
    MAIL_SERVER = 'smtp.gmail.com',
    MAIL_PORT = 465,
    MAIL_USE_SSL = True,
    MAIL_USE_TLS = False,
    MAIL_USERNAME = '******',
    MAIL_PASSWORD = '******'
)

mail = Mail(app)

#CS50.net
def lookup(symbol):
    """Look up quote for symbol."""

    # Contact API
    try:
        response = requests.get(f"https://api.iextrading.com/1.0/stock/{urllib.parse.quote_plus(symbol)}/quote")
        response.raise_for_status()
    except requests.RequestException:
        return None

    # Parse response
    try:
        quote = response.json()
        return {
            "name": quote["companyName"],
            "price": float(quote["latestPrice"]),
            "symbol": quote["symbol"]
        }
    except (KeyError, TypeError, ValueError):
        return None


@app.route('/')
def print_date_time():
    Symbol = "PG"
    Symbol = lookup(Symbol)
    msg = mail.send_message(
        'PG',
        sender='*****',
        recipients=['******'],
        body = "PG DROP BELOW 91 buy now"
    )





scheduler = BackgroundScheduler()
scheduler.add_job(func=print_date_time, trigger="interval", seconds=10)
scheduler.start()

# Shut down the scheduler when exiting the app
atexit.register(lambda: scheduler.shutdown())

我使用Python使用Flask创建了一个应用程序,如果满足条件,它将每10秒向我发送一个Gmail。当我运行该应用程序我得到这样的:

"RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information. "

我的想法是该错误是由于我尝试通过Gmail发送邮件而引起的,该邮件位于应用程序上下文之外。有任何想法吗 ?? THKS

1 个答案:

答案 0 :(得分:0)

您的功能print_date_time正在通过 app上下文之外的新线程执行,并且Mail对象需要它。 您应该将带有app对象的参数传递给函数(不需要装饰器路由)。该参数的值为current_app._get_current_object()

我已经重新实现了您的功能print_date_time

def print_date_time(app):
    with app.app_context():
        Symbol = "PG"
        Symbol = lookup(Symbol)
        msg = mail.send_message(
            'PG',
            sender='*****',
            recipients=['******'],
            body = "PG DROP BELOW 91 buy now"
        )