在flask应用程序中使用乌龟orm初始化数据库的正确方法是什么



在完成关于乌龟ORM的章节之前,我学习了烧瓶。我试着把烧瓶和乌龟结合起来,但找不到合适的方法。当我调用异步函数时,我得到了错误:

Traceback (most recent call last):
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflask_compat.py", line 39, in reraise
raise value
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflask_compat.py", line 39, in reraise
raise value
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagesflaskapp.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:UsersVladlenpythonpythonBasicslesson 19viewsdoc_income.py", line 19, in new
run_async(create_doc(request.values['account_id'], request.values['sum']))
File "C:UsersVladlenpythonpythonBasicsvenvlibsite-packagestortoise__init__.py", line 634, in run_async
loop = asyncio.get_event_loop()
File "C:UsersVladlenAppDataLocalProgramsPythonPython37libasyncioevents.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帮助程序也强制清理DB,所以我不确定这是否是您想要的。

抱歉,但你本质上是用一种不兼容的颜色打来的,而且是开拓性的,我无法给出一个texbook的答案。

我最初的回答是:Flask是一个同步Python框架,它不使用事件循环。考虑使用基于异步的框架,如Quart/aiohttp/starlette,这两个框架和Tortoise ORM都使用相同的并发方法,应该可以工作。

最新更新