如何解决在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都使用相同的并发方法,并且应该可以使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。