Wolf_Yout
@Wolf_Yout

Как запустить асинхронную функцию внутри синхронной flask?

Код:
@app.route("/")
def index():
    if "id" in session:
        print(session.get("id"))
        user = await bot.fetch_user(session.get("id"))
        print(user)
        return render_template("index.html",bot_name=bot.user.name,servers=len(bot.guilds),users=len(bot.users),user_name=user.name)
    else:
        return render_template("index.html",bot_name=bot.user.name,servers=len(bot.guilds),users=len(bot.users),user_name=None)

@app.route("/login")
def log_in():
    if not "id" in session:
        return redirect("https://discord.com/api/oauth2/authorize?client_id=1047125592220373075&redirect_uri=http%3A%2F%2Fde4.bot-hosting.net%3A7259%2Fsave_me&response_type=code&scope=identify%20guilds%20email")
    else:
        return redirect(url_for("save_me"))

@app.route("/save_me")
def save_me():
    code = flask.request.args.get("code")
    at = Oauth.get_access_token(code)

    user = Oauth.get_user_json(at)
    session["id"] = user.get("id")
    return redirect("http://de4.bot-hosting.net:7259/")

def run_flask():
    app.run(host="0.0.0.0", port=7259)

Thread(target=run_flask).start()

Айди определяется успешно, но вот получение пользователя нет, т.к. я запускаю await внутри синхронной функций, как мне запустить эту асинхронную функцию?
  • Вопрос задан
  • 305 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну для начала, проверка на вменяемость. Асинхронному боту для работы нужен рабочий цикл-реактор (event loop). Где и как ты его запускаешь, с учётом того, что Flask тоже требует рабочий цикл, а у тебя, вроде как, один поток?

Я бы посоветовал использовать асинхронный веб-фреймворк. Например, доки на Flask упоминают Quart как максимально похожий, но изначально асинхронный фреймворк. Тебе всё ещё придётся разобраться, как параллельно запустить две длительные корутины (рабочий цикл Quart и рабочий цикл бота), но это уже решаемо. Вместо Quart можно использовать любой другой асинхронный веб-фреймворк.

Альтернативно, можно запустить фласк и бота в разных потоках. Мешать асинхронность с многопоточностью - тоже та ещё идея, но если очень неохота уходить от Flask, то можно попробовать. Однако в этом случае нужно будет очень осторожно выполнять вызовы методов бота. В документации есть пример, как вызвать корутину в другом потоке ОС и дождаться ответа от неё.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы