如何停止使用异步调用阻止我的 Flask 路由?

How do I stop blocking my Flask Route with an Async call?

我有一个函数,它创建一个新的库存项目并调用外部 API 来生成条形码。我如何在我的函数 returns 之后调用 urllib.request.urlretrieve(api_request_url, file_name),这样它就不会阻塞我的 API?

@api.route('/api/inventory/new/<id>', methods=['POST'])
@cross_origin()
def new_inventory(id):
    name=request.json['name']
    uid=request.json['uid']
    item = Inventory(common_name=name, uid=uid)
    api_request_url = "https://api.qrserver.com/v1/create-qr-code/?size=150x150&data={0}".format(uid)
    file_name = "app/static/{0}.png".format(uid)
    urllib.request.urlretrieve(api_request_url, file_name)
    db.session.add(item)
    db.session.commit()
    return jsonify({'results': True})

简单的将Flask放入Gunicorn or uWSGI would prevent blocking the API. Creating a thread would be a second level of optimization, and finally for production you'd want to implement a task queue with something like Celery等WSGI容器中。