在烧瓶中发送发布请求时出现错误(python)

2023-12-02

我正在向协程函数发送一个发布请求,但出现以下错误。

    Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1994, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.4/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1615, in full_dispatch_request
    return self.finalize_request(rv)
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1630, in finalize_request
    response = self.make_response(rv)
  File "/usr/local/lib/python3.4/site-packages/flask/app.py", line 1740, in make_response
    rv = self.response_class.force_type(rv, request.environ)
  File "/usr/local/lib/python3.4/site-packages/werkzeug/wrappers.py", line 885, in force_type
    response = BaseResponse(*_run_wsgi_app(response, environ))
  File "/usr/local/lib/python3.4/site-packages/werkzeug/wrappers.py", line 57, in _run_wsgi_app
    return _run_wsgi_app(*args)
  File "/usr/local/lib/python3.4/site-packages/werkzeug/test.py", line 884, in run_wsgi_app
    app_rv = app(environ, start_response)
TypeError: 'generator' object is not callable

以下是提交按钮后调用的函数: 函数 f() 从 get 请求中获取一些数据并从响应中返回 json。

    @app.route('/submit', methods=['POST'])
    @asyncio.coroutine
    def submit():
       result = yield from f()
       return  render_template('test.html', result=result)


def f()
  response = yield from request('get',...)
  ....

你不能使用协程作为 Flask 路由,这不是 Flask 或 WSGI 协议的工作方式。 WSGI 为每个线程/进程/eventlet 处理一个请求/响应。如果您需要执行后台任务,请生成一个线程或使用像 Celery 这样的任务队列。

You can返回包含生成器的响应流式传输响应。但它仍然会在一个线程中同步运行。

def stream():
    yield 'thing one'
    yield from other_thing()
    yield 'thing two'

return current_app.response_class(stream())

如果你使用gevent,你可以使用 eventlet 而不是线程处理每个请求,在这种情况下您可以生成其他 eventlet。这带来了它自己的性能问题,因为所有 eventlet 都在一个线程中循环运行(对于 asyncio 也是如此)。 Gunicorn 还支持 aiohttp,但 Flask 不支持,尽管也许可以让它工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在烧瓶中发送发布请求时出现错误(python) 的相关文章

随机推荐