Python Flask с Telethon

Я хочу использовать Telethon Telegram API из своего веб-приложения Flask. Но когда я запускаю его, я получаю следующую ошибку:

RuntimeError: в потоке Thread-1 нет текущего цикла событий.

Я думаю, что с asyncio есть проблемы. Но я в этом не уверен.

Вот мой код

#!/usr/bin/python3

from flask import Flask
from telethon import TelegramClient
from telethon import sync

app = Flask(__name__)

@app.route('/')
def index():
    api_id = XXXXXX
    api_hash = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    client = TelegramClient('XXXXXX', api_id, api_hash)
    client.start()
    return 'Index Page'

if __name__ == '__main__':
    app.run()

person Robert Brown    schedule 12.07.2018    source источник


Ответы (2)


В основном это связано с GIL Python. Если вы не хотите копаться во внутреннем устройстве asyncio, просто pip3 install telethon-sync, и все готово.

person norus    schedule 18.07.2018
comment
Не беспокойся. Также есть дополнительная информация о telethon.readthedocs.io/en/stable / extra / basic / - person norus; 20.07.2018
comment
его устарело, любое другое решение? - person Saeb Molaee; 15.05.2020
comment
@SaebMolaee см. Могу ли я использовать Flask с библиотекой? в документации. - person Lonami; 20.07.2020
comment
@Lonami. Интересно, почему вы не рекомендуете Flask с Telethon? Не могли бы вы подробно рассказать о своей идее? - person Ian Elvister; 28.02.2021
comment
Фляга с резьбой. Telethon использует asyncio. Использование потоков и asyncio - ненужная головная боль, даже если вы знаете, что делаете. Я ничего не имею против фляги как таковой, но есть альтернативы фляжке, которые являются нативными для asyncio. - person Lonami; 28.02.2021
comment
Я предполагаю, что единственная проблема может быть связана с отладкой, так как я нажал на prod, и все работает нормально. - person Ian Elvister; 11.03.2021

Вот что я узнал после того, как попробовал это. Во-первых, убедитесь, что вы знаете, что такое asyncio, это действительно очень просто. Тогда вы сможете работать над этим с большей продуктивностью.

Telethon использует asyncio, что означает, что при вызове методов блокировки вам нужно дождаться завершения работы сопрограммы.

client.loop ###Doesn't work inside flask, it might have to do with threads.

Вы можете легко импортировать asyncio и использовать основной цикл. нравится.

import asyncio
loop = asyncio.get_event_loop()

Теперь вы готовы дождаться завершения сопрограмм.

  1. Создайте новую асинхронную функцию и добавьте ожидание в методы блокировки.
  2. Выполните код, используя основной цикл событий.

Вот пример кода.

async def getYou():
    return await client.get_me()

@app.route("/getMe", methods=['GET'])
def getMe():
    return {"MyTelegramAccount": loop.run_until_complete(getYou())}

И вот еще. не используйте telethon.sync, он не полностью переведен на синхронизацию, он использует вышеуказанный шаблон, он ожидает все методы.

person Ian Elvister    schedule 27.02.2021