Python 如何让eve根据不同的URL参数和请求值写入不同的数据库?

Python 如何让eve根据不同的URL参数和请求值写入不同的数据库?,python,mongodb,eve,Python,Mongodb,Eve,我正在尝试创建一个RESTAPI,它选择适当的mongo数据库和正确的集合进行写入。如何让eve选择与参数和集合同名的数据库?假设您有参数“dbname”和“collectionname”,还有一个名为“client”的全局MongoClient实例: PyMongo的客户端支持“[]”语法来获取具有给定名称的数据库,PyMongo的数据库支持“[]”来获取集合 下面是一个更完整的烧瓶示例: client = MongoClient() @app.route('/<dbname>/

我正在尝试创建一个RESTAPI,它选择适当的mongo数据库和正确的集合进行写入。如何让eve选择与参数和集合同名的数据库?

假设您有参数“dbname”和“collectionname”,还有一个名为“client”的全局MongoClient实例:

PyMongo的客户端支持“[]”语法来获取具有给定名称的数据库,PyMongo的数据库支持“[]”来获取集合

下面是一个更完整的烧瓶示例:

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()