Python Flask with Telethon
Python Flask with Telethon
我想在我的 Flask Web 应用程序中使用 Telethon Telegram API。但是当我 运行 它时,我收到以下错误:
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()
基本上,这是由于 Python 的 GIL。如果您不想深入研究 asyncio
内部结构,只需 pip3 install telethon-sync
就可以了。
以下是我在尝试之后学到的东西。首先,确保你知道什么是 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()
现在您已准备好等待协程完成。
- 创建一个新的异步函数并将 await 添加到阻塞方法中。
- 使用主事件循环执行代码。
Here's a code sample.
async def getYou():
return await client.get_me()
@app.route("/getMe", methods=['GET'])
def getMe():
return {"MyTelegramAccount": loop.run_until_complete(getYou())}
还有一件事。不要使用 telethon.sync,它没有完全转换为同步,它使用上面的模式等待所有方法。
在你的位置,我会考虑使用 Quart Telethon 自己的文档中建议的,它更容易。
我想在我的 Flask Web 应用程序中使用 Telethon Telegram API。但是当我 运行 它时,我收到以下错误:
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()
基本上,这是由于 Python 的 GIL。如果您不想深入研究 asyncio
内部结构,只需 pip3 install telethon-sync
就可以了。
以下是我在尝试之后学到的东西。首先,确保你知道什么是 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()
现在您已准备好等待协程完成。
- 创建一个新的异步函数并将 await 添加到阻塞方法中。
- 使用主事件循环执行代码。
Here's a code sample.
async def getYou():
return await client.get_me()
@app.route("/getMe", methods=['GET'])
def getMe():
return {"MyTelegramAccount": loop.run_until_complete(getYou())}
还有一件事。不要使用 telethon.sync,它没有完全转换为同步,它使用上面的模式等待所有方法。
在你的位置,我会考虑使用 Quart Telethon 自己的文档中建议的,它更容易。