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