flask: RunTimeError: В потоке нет текущего цикла событий - PullRequest
0 голосов
/ 04 ноября 2019

Я делаю простое приложение для колб, которое возвращает результаты с внешнего веб-сайта. Пользователь вводит данные на мой сайт. Эти данные используются для загрузки другого сайта. Данные извлекаются и возвращаются в виде списка. Эта программа работает независимо, но не будет работать как часть приложения фляги. Я пытался использовать библиотеку запросов_HTML, используя его асинхронные инструменты, и я пытался использовать Pyro4, чтобы отправить запрос во внешний процесс. Но я всегда придумываю какую-то версию этой ошибки:

RunTimeError: В потоке нет текущего цикла событий ........

Мне кажется, что когда один измои импортированные модули запускают поток Flask это не нравится. Я хотел бы знать, почему это происходит, является ли что-то во внутренней работе фляг, это означает, что это не будет хорошо работать с потоками или асинхронностью или чем-то еще? Любое направление к каким-либо дополнительным ресурсам или информации было бы очень полезно

Это мое приложение Flask:

from flask import Flask, render_template
from requests_html import AsyncHTMLSession

app = Flask(__name__)
asession = AsyncHTMLSession()
URLS=["https://stackoverflow.com/questions/",
      "https://stackoverflow.com/questions/",
      "https://stackoverflow.com/questions/"]

@app.route("/", methods=('GET'))
def index():
results = asession.run(run_requests)
return render_template('index_page.html', results_list=results)

async def run_requests():
    results_list=[]
    for url in URLS:
        results_list.append(await get_and_render(url))
    return results_list

async def get_and_render(url):
    r = await asession.get(url)
    await r.html.arender(sleep=0.75)
    summary = r.html.find(".question-hyperlink", first=True)
    return summary.text

Это откроет страницу вопросов stackoverflow и соберет резюме последнего опубликованного вопроса. Я пробовал этот код в автономном файле Python, и он отлично работает. (т. е. вне приложения с колбой, просто вывод результатов в командную строку)

Это по трассировке от отладчика фляги:

'Traceback (most recent call last):
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2463, in __call__
 return self.wsgi_app(environ, start_response)
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2449, in wsgi_app
 response = self.handle_exception(e)
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1866, in handle_exception
 reraise(exc_type, exc_value, tb)
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 39, in reraise
 raise value
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 2446, in wsgi_app
 response = self.full_dispatch_request()
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
 rv = self.handle_user_exception(e)
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1820, in handle_user_exception
 reraise(exc_type, exc_value, tb)
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\_compat.py", line 39, in reraise
 raise value
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
 rv = self.dispatch_request()
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\flask\app.py", line 1935, in dispatch_request
 return self.view_functions[rule.endpoint](**req.view_args)
 File "C:\......\StackOverflowExample.py", line 11, in index
 results = asession.run(run_requests)
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\requests_html.py", line 771, in run
 tasks = [
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\site-packages\requests_html.py", line 772, in <listcomp>
 asyncio.ensure_future(coro()) for coro in coros
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\asyncio\tasks.py", line 660, in ensure_future
 loop = events.get_event_loop()
 File "C:\Users\Alex\AppData\Local\Programs\Python\Python38-32\Lib\asyncio\events.py", line 639, in get_event_loop
 raise RuntimeError('There is no current event loop in thread %r.'
 RuntimeError: There is no current event loop in thread 'Thread-4'.

Может кто-нибудь объяснить, почему колбе не удается выполнить этиЗадачи?

ура

PS вот мой простой HTML (хотя приложение еще не смогло его отобразить.):

        <ul>
            {% for result in results_list %}
            <li>{{result}}</li>
            {% endfor %}
        </ul>

Вот мой скрипт за пределами приложения фляги (работает):

from requests_html import AsyncHTMLSession
asession = AsyncHTMLSession()
URLS=["https://stackoverflow.com/questions/",
  "https://stackoverflow.com/questions/",
  "https://stackoverflow.com/questions/"]

def index():
    results = asession.run(run_requests)
    for result in results:
        print(result)

async def run_requests():
    results_list=[]
    for url in URLS:
        results_list.append(await get_and_render(url))
    return results_list

async def get_and_render(url):

    r = await asession.get(url)
    await r.html.arender(sleep=0.75)
    summary = r.html.find(".question-hyperlink", first=True)
    print(summary.text)

if __name__ == "__main__":
    index()
...