Python 如何让eve根据不同的URL参数和请求值写入不同的数据库?
我正在尝试创建一个RESTAPI,它选择适当的mongo数据库和正确的集合进行写入。如何让eve选择与参数和集合同名的数据库?假设您有参数“dbname”和“collectionname”,还有一个名为“client”的全局MongoClient实例: PyMongo的客户端支持“[]”语法来获取具有给定名称的数据库,PyMongo的数据库支持“[]”来获取集合 下面是一个更完整的烧瓶示例:Python 如何让eve根据不同的URL参数和请求值写入不同的数据库?,python,mongodb,eve,Python,Mongodb,Eve,我正在尝试创建一个RESTAPI,它选择适当的mongo数据库和正确的集合进行写入。如何让eve选择与参数和集合同名的数据库?假设您有参数“dbname”和“collectionname”,还有一个名为“client”的全局MongoClient实例: PyMongo的客户端支持“[]”语法来获取具有给定名称的数据库,PyMongo的数据库支持“[]”来获取集合 下面是一个更完整的烧瓶示例: client = MongoClient() @app.route('/<dbname>/
client = MongoClient()
@app.route('/<dbname>/<collection_name>')
def find_something(dbname, collection_name):
return client[dbname][collection_name].find_one()
client=MongoClient()
@应用程序路径(“/”)
def find_something(数据库名、集合名):
返回客户端[dbname][collection\u name].find\u one()
我的示例的优点是它在整个过程中重用了一个MongoClient,因此您可以获得最佳性能和连接池。当然,糟糕的是,您允许用户访问任何数据库和任何集合,因此您希望以某种方式确保其安全。即将推出的v0.6 Eve将在本机上支持多个Mongo实例 新增:支持多个MongoDB数据库和/或服务器 您可以让不同的Mongo实例为各个API端点提供服务:
mongo\u前缀
资源设置允许覆盖从配置检索MongoDB设置时使用的默认mongo前缀。例如,将资源mongo_前缀设置为MONGO2,以便从设置文件(MONGO2_主机、MONGO2_数据库名等)中配置了该前缀的数据库进行读/写
和/或您可以根据访问数据库的用户使用不同的Mongo实例:
set\u mongo\u prefix()
和get\u mongo\u prefix()
已添加到BasicAuth类和派生类中。这些可用于根据执行请求的令牌/客户端任意设置目标数据库
用户实例的(非常)幼稚的实现,取自:
此外:
缓存数据库连接是为了不影响性能。此外,此更改仅影响MongoDB引擎,因此当前针对其他数据库的扩展不需要更新(但它们不会继承此功能)
希望这能满足你的需要。它目前在分支上,因此您已经可以对它进行实验/玩了。到目前为止您有什么?数据库详细信息存储在哪里?我有一个数据库的应用程序工作,但我想有多个。我在settings.py文件中有所有设置。例如,我需要两个数据库,address和employee。它们中的每一个都将有一个或多个集合。理想情况下,我能够有一个localhost/employee/hr格式的URL,并让它访问员工数据库中的hr集合,而无需触及任何与地址相关的内容。这有意义吗?@SimeonVisser说得清楚吗?每次通话都有这样做的方法吗?我将把这种调用放在堆栈的什么位置,以确保正确的数据库用于CRUD操作?你知道有没有一种方法可以在eve这样的框架中轻松使用这种功能,还是我只需要使用flask?这正是我所需要的。有没有一种方法可以在auth之外实现?我想根据请求中的路径或值更改数据库,我认为这在功能上与auth不同。另外,我是否能够检查该值是否与数据库名称相同?
client = MongoClient()
@app.route('/<dbname>/<collection_name>')
def find_something(dbname, collection_name):
return client[dbname][collection_name].find_one()
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()