«RuntimeError: Работа вне контекста приложения» с приложением Python Flask (Отправка Gmail с помощью планировщика) - PullRequest
0 голосов
/ 31 января 2019
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())

Я создаю приложение с Flask, используя Python, которое будет отправлять мне Gmail каждые 10 секунд, если условие будет выполнено.Когда я запустил приложение, я получил это:

"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 голосов
/ 31 января 2019

Ваша функция print_date_time выполняется через новый поток вне контекста приложения , и объект Mail нуждается в этом.Вы должны передать параметр с объектом приложения в вашу функцию (маршрут декоратора не требуется).Значение этого параметра: 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"
        )
...