代码之家  ›  专栏  ›  技术社区  ›  peachykeen

异步和异步错误-typeerror:“coroutine”对象不可调用

  •  1
  • peachykeen  · 技术社区  · 8 年前

    我试图在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>"""
    

    是什么导致了这个错误?

    2 回复  |  直到 8 年前
        1
  •  3
  •   nosklo    8 年前

    flask 不是异步的。它与 asyncio 一点也不,通过一个 async 功能到 @app.route 在烧瓶里应用是行不通的。

    我建议使用 quart 相反。

        2
  •  1
  •   Jibin Mathew    7 年前

    你应该考虑使用 Sanic 是的。它非常快,处理异步请求非常好。

    有了Sanic你可以考虑 this 解决方案。

    推荐文章