簡體   English   中英

帶有 Telethon 的 Python 燒瓶

[英]Python Flask with Telethon

我想從我的 Flask Web 應用程序中使用 Telethon Telegram API。 但是當我運行它時,我收到以下錯誤:

運行時錯誤:線程“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()

現在您已准備好等待協程完成。

  1. 創建一個新的異步函數並將 await 添加到阻塞方法中。
  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,它沒有完全轉換為同步,它使用上述模式等待所有方法。

在你的地方,我會考慮使用Quart,它是 Telethon 自己的文檔中建議的,它更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM