我尝试创建一个REST API,选择要写入的相应mongo数据库以及正确的集合。我如何选择与参数同名的数据库以及集合?
答案 0 :(得分:2)
即将推出的v0.6 Eve将原生支持多个Mongo实例。
新增功能:支持多个MongoDB数据库和/或服务器。
您可以让不同的Mongo实例提供单独的API端点:
mongo_prefix
资源设置允许覆盖从配置中检索MongoDB设置时使用的默认MONGO前缀。例如,将资源mongo_prefix设置为MONGO2,以便从设置文件中配置了该前缀的数据库进行读/写(MONGO2_HOST,MONGO2_DBNAME等)
和/或您可以使用不同的Mongo实例,具体取决于用户访问数据库:
set_mongo_prefix()
和get_mongo_prefix()
已添加到 BasicAuth 类和派生中。这些可用于根据执行请求的令牌/客户端任意设置目标数据库。
从({3}}:
获取的(非常)天真的用户实例实现from eve.auth import BasicAuth
class MyBasicAuth(BasicAuth):
def check_auth(self, username, password, allowed_roles, resource, method):
if username == 'user1':
self.set_mongo_prefix('MONGO1')
elif username == 'user2':
self.set_mongo_prefix('MONGO2')
else:
# serve all other users from the default db.
self.set_mongo_prefix(None)
return username is not None and password == 'secret'
app = Eve(auth=MyBasicAuth)
app.run()
此外:
缓存数据库连接以避免性能下降。此外,此更改仅影响MongoDB引擎,因此当前针对其他数据库的扩展不应该需要更新(但它们不会继承此功能。)
希望这能满足您的需求。它目前位于docs分支上,因此您可以尝试/使用它。
答案 1 :(得分:1)
假设您有参数" dbname"和"集合名称",以及名为" client"的全局MongoClient实例:
collection = client[dbname][collectionname]
PyMongo的客户端支持" []"获取具有给定名称的数据库的语法,PyMongo的数据库支持" []"获得一个集合。
这是Flask的一个更完整的例子:
client = MongoClient()
@app.route('/<dbname>/<collection_name>')
def find_something(dbname, collection_name):
return client[dbname][collection_name].find_one()
我的例子的好处是它重用了一个MongoClient,因此您可以获得最佳性能和连接池。当然,糟糕的是,您允许您的用户访问任何数据库和任何集合,因此您需要以某种方式保护它。