python - 异步和异步错误——TypeError : 'coroutine' object is not callable

标签 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)
  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>"""

是什么导致了这个错误?

最佳答案

flask 不是异步的。它根本不与 asyncio 直接兼容,并且在 flask 应用程序中将 async 函数传递给 @app.route 将不起作用。

我建议使用 quart反而。

关于python - 异步和异步错误——TypeError : 'coroutine' object is not callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51107877/

相关文章:

python - 无法通过 Flask 应用程序 Pod 连接到 MongoDB Pod

python - 我的 Flask REST API 有多安全?

python - 如何在 Google Colab 中的另一个虚拟机上拍摄和恢复模型训练的快照?

python - 当真与当假

python - 删除/覆盖导入

python - 如何覆盖 python 的 "not in"运算符

python - python SDK如何将类类型转换为字符串

python - 是否有相当于 .NET 的 ListView 控件的 Tkinter 小部件?

python - 将 pandas 过滤器应用于数据帧会得到一个充满 NaN 的数据帧

另一个函数内部的 Flask Celery update_state