如何在Vercel无服务器功能中的Flask+mongo(pymongo)中共享/确保连接关闭



我目前正在使用vercel作为带有python无服务器功能的api。我定义了几个函数。

示例文件可能看起来像。。。

import pymongo
from flask import Flask, jsonify

MONGO_URL = os.environ["MONGO_URL"]
CLIENT = pymongo.MongoClient(MONGO_URL)
DB = pymongo.database.Database(CLIENT, os.environ.get("DB") or "test")
app = Flask(__name__)
@app.route("/api/sample_route", methods=["GET"])
def sample_route(path=""):
COLLECTION = DB.sample_collection
if request.method == "GET":
query = {}
data = list(COLLECTION.find(query, {"_id": 0}))
return jsonify(data)

然而,我注意到,在没有任何用户的情况下,我很快就在本地开发人员的网站上使用了500连接池。我认为没有进行连接池,它们也没有得到充分的关闭。知道为什么吗?

有更好的方法可以做到这一点,但根据我的经验,我看到人们定义了返回数据库客户端对象的函数,该对象进一步用于执行CRUD操作的函数

def get_db_client(host=MONGO_URL, port=27017):
client = MongoClient(host=host
return client

执行CRUD的烧瓶功能示例如下:

@app.route('/orders')
def get_orders():
client = None
try:
client = get_db_client()
db = client["orders_database"]
order_id = int(request.args.get('order_id'))
cursor = db.orders_tb.find({"order_id": order_id})
except:
# Some exception handling
pass
finally:
if type(client)==MongoClient:
client.close()
return jsonify({"result": list(cursor)})

主要动机是每次完成连接时都要关闭连接。除了我最后在这里展示的之外,你可以找到比尝试更好的设计模式,但关闭连接是至关重要的。

相关内容

  • 没有找到相关文章

最新更新