我可以动态创建数据库实例以与mongo_prefix一起使用吗?

时间:2018-03-19 01:11:49

标签: eve

mongo_prefix看起来非常适合简单有效的数据分离,但您似乎需要在settings.py中预先定义可用的前缀。是否可以动态创建新前缀 - 例如,在创建该用户时为每个用户创建一个新实例?

2 个答案:

答案 0 :(得分:2)

身份验证基类具有set_mongo_prefix()方法,允许您根据当前用户设置活动数据库。此代码段来自documentation

  

自定义身份验证类还可以设置在提供活动请求时应使用的数据库。

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('USER1_DB')
        elif username == 'user2':
             self.set_mongo_prefix('USER2_DB')
        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()

当然,上面是一个简单的实现,但它可能是一个有用的起点。有关完整细分,请参阅上述文档链接。

答案 1 :(得分:0)

最终问题的答案是,如果您尚未首先在settings.py中指定匹配值,则将为您创建带有默认值的前缀数据库。如果您无法将值放在settings.py中(可能是因为您当时不了解它们),您可以稍后动态添加它们;下面是一个小例子。

def add_db_to_config(app, config_prefix='MONGO'):

    def key(suffix):
        return '%s_%s' % (config_prefix, suffix)

    if key('DBNAME') in app.config:
       return

    app.config[key('HOST')] = app.config['MONGO_HOST']
    app.config[key('PORT')] = app.config['MONGO_PORT']
    app.config[key('DBNAME')] = key('DBNAME')
    app.config[key('USERNAME')] = None
    app.config[key('PASSWORD')] = None

然后,例如在check_auth(...)

    add_db_to_config(app, 'user_x_db')
    self.set_mongo_prefix('user_x_db')