在Flask应用程序中使用Tormise Orm初始化数据库的正确方法是什么?

问题描述

在完成有关乌龟ORM的章节之前,我学习了烧瓶。 我尝试将烧瓶和乌龟结合在一起,但找不到正确的方法。 当我调用异步函数时出现错误

Traceback (most recent call last):
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\app.py",line 2464,in __call__
    return self.wsgi_app(environ,start_response)
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\app.py",line 2450,in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\app.py",line 1867,in handle_exception
    reraise(exc_type,exc_value,tb)
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\_compat.py",line 39,in reraise
    raise value
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\app.py",line 2447,in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\app.py",line 1952,in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\app.py",line 1821,in handle_user_exception
    reraise(exc_type,line 1950,in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\flask\app.py",line 1936,in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\Vladlen\python\pythonBasics\lesson 19\views\doc_income.py",line 19,in new
    run_async(create_doc(request.values['account_id'],request.values['sum']))
  File "C:\Users\Vladlen\python\pythonBasics\venv\lib\site-packages\tortoise\__init__.py",line 634,in run_async
    loop = asyncio.get_event_loop()
  File "C:\Users\Vladlen\AppData\Local\Programs\Python\python37\lib\asyncio\events.py",line 644,in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'Thread-7'.

我的代码创建文档的一部分:

@doc_income_app.route("new",methods=['GET','POST'])
def new():
    if request.method == 'GET':
        return render_template('doc_income/new.html')
    else:
        run_async(create_doc(request.values['account_id'],request.values['sum']))
        return jsonify(ok=True)


async def create_doc(account_id,sum):
    await db.init()
    doc = db.DocIncome(
        account_id=account_id,sum=sum
    )
    await doc.save()

我的问题是如何在flask应用程序中调用异步数据库操作代码

解决方法

如何从同步代码中调用异步代码?

创建一个事件循环,然后在其中运行代码。问题是必须清除事件循环,因此任何计划的任务都将使其永无止境。 (这样做run_until_complete的风险) 基本上:

asyncio.get_event_loop().run_until_complete(create_doc(...))

乌龟提供的run_async帮助程序还强制清除了数据库,因此我不确定这就是您想要的。

道歉,但是您实际上是从不兼容的colour打电话来的,这是开拓性的,我无法提供texbook的答案。

我的原始答案: Flask是一个同步的Python框架,它不使用事件循环。 考虑使用基于异步的框架(例如Quart / aiohttp / starlette),该框架和Tortoise-ORM都使用相同的并发方法,并且应该可以使用。