Python 异步和异步IO错误——类型错误:';协同程序';对象不可调用
我试图在Python3.x中的Flask应用程序中异步运行一个函数。我正在使用Python 异步和异步IO错误——类型错误:';协同程序';对象不可调用,python,python-3.x,flask,python-asyncio,Python,Python 3.x,Flask,Python Asyncio,我试图在Python3.x中的Flask应用程序中异步运行一个函数。我正在使用asyncio库,并将async放在函数声明之外,但我收到一个错误,该错误如下: Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__ return self.wsgi_app(environ, start_response)
asyncio
库,并将async
放在函数声明之外,但我收到一个错误,该错误如下:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1615, in full_dispatch_request
return self.finalize_request(rv)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1630, in finalize_request
response = self.make_response(rv)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1740, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "/usr/local/lib/python3.6/site-packages/werkzeug/wrappers.py", line 885, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
File "/usr/local/lib/python3.6/site-packages/werkzeug/test.py", line 884, in run_wsgi_app
app_rv = app(environ, start_response)
TypeError: 'coroutine' object is not callable
我的代码如下:
import asyncio
... more function definitions ...
@app.route("/save_to_dbx")
@login_required
async def save_to_dbx():
""" Saves a course to Dropbox as a .zip """
# Creating a .zip file out of the course
zip = zipfile.ZipFile("IoT.zip", "w")
for subdir, dirs, files in os.walk(os.path.join(BASE_PATH, "static/Content/IoT")):
for file in files:
complete__file_path = os.path.join(subdir, file)
print("Writing to Zip:", complete__file_path)
zip.write(complete__file_path, complete__file_path.split("/")[-1])
zip.close()
# Uploading the .zip to Dropbox
f = open(os.path.join(BASE_PATH, "IoT.zip"))
file_size = os.path.getsize(os.path.join(BASE_PATH, "IoT.zip"))
CHUNK_SIZE = 4 * 1024 * 1024
print("Upload file size:", file_size)
if file_size <= CHUNK_SIZE:
print(__dbx_conn__().files_upload(f, "/VOSW-Backup-Testing/IoT.zip"))
else:
upload_session_start_result = __dbx_conn__().files_upload_session_start(f.read(CHUNK_SIZE))
cursor = dropbox.files.UploadSessionCursor(
session_id=upload_session_start_result.session_id,
offset=f.tell())
commit = dropbox.files.CommitInfo(path="/VOSW-Backup-Testing/IoT.zip")
while f.tell() < file_size:
if ((file_size - f.tell()) <= CHUNK_SIZE):
print(__dbx_conn__().files_upload_session_finish(f.read(CHUNK_SIZE), cursor, commit))
else:
__dbx_conn__().files_upload_session_append_v2(f.read(CHUNK_SIZE), cursor)
cursor.offset = f.tell()
return """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Success!</title>
</head>
<body>
<h1>Success!</h1>
</body>"""
导入异步IO
... 更多函数定义。。。
@app.route(“/save_to_dbx”)
@需要登录
异步def将_保存到_dbx():
“”“将到Dropbox的课程另存为.zip”“”
#在课程之外创建.zip文件
zip=zipfile.zipfile(“IoT.zip”,“w”)
对于os.walk(os.path.join(BASE_path,“static/Content/IoT”)中的subdir、dir和文件:
对于文件中的文件:
完成文件路径=os.path.join(子目录,文件)
打印(“写入Zip:,完成文件路径)
zip.write(complete\u file\u path,complete\u file\u path.split(“/”[-1]”)
zip.close()
#将.zip上载到Dropbox
f=open(os.path.join(基本路径,“IoT.zip”))
file_size=os.path.getsize(os.path.join(BASE_path,“IoT.zip”))
区块大小=4*1024*1024
打印(“上载文件大小:”,文件大小)
如果文件大小不是异步的。它根本不与asyncio
直接兼容,将async
函数传递给@app。在flask应用程序中路由
将不起作用
我建议改用你应该考虑使用。它速度非常快,能够很好地处理异步请求
用SANIC你可以考虑解决问题。使用普通线程怎么样?基本上我想上传到Dropbox,但速度非常慢,所以我希望进程在后台运行。@agaidis flask默认情况下已经使用线程-每个请求都在自己的线程中运行,因此您不必做任何事情,在上传时,您的应用程序仍能够响应其他请求。我想走了,谢谢你的回复。它可能可以接受额外的请求,但当用户等待将1GB.zip上传到Dropbox时,网页会“冻结”。我所在的团队与烧瓶有着紧密的联系,所以如果夸脱真的会飞的话,请点击idk。在Flask中,你能想到什么来实现这种后台处理吗?@agaidis我仍然建议你应该使用异步网络——这是一个完美的用例;另一种常见的解决方法是将消息队列卸载到工作进程。但您的进程只是想等待网络,所以异步是一种方式