如何根据各种URL参数和请求值将eve写入不同的数据库?

时间:2015-06-09 22:35:00

标签: python mongodb eve

我尝试创建一个REST API,选择要写入的相应mongo数据库以及正确的集合。我如何选择与参数同名的数据库以及集合?

2 个答案:

答案 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,因此您可以获得最佳性能和连接池。当然,糟糕的是,您允许您的用户访问任何数据库和任何集合,因此您需要以某种方式保护它。