我有一个应用程序,可以使用相同的代码库配置两种类型的功能。根据配置,启用或禁用某些功能。一个这样的功能是,如果所有路线都需要登录。例如:
if app.config['IS_PRIVATE_INSTANCE'] :
@app.before_request
def check_logged_in():
if request.endpoint and not request.endpoint == 'security.login' and not request.endpoint == 'security.logout' and not request.endpoint == 'security.forgot_password' and not request.endpoint == 'security.reset_password':
return app.login_manager.unauthorized()
一个版本适用于不需要登录且不使用某些功能的一般公众。另一个是每个客户端的私有版本,增加的功能和访问仅限于注册用户。
一般公共版本的目的始终是单个实例,但我们目前有几个私有版本的实例(有自己的数据库)为不同的客户端运行。
现在的任务是使用子域将所有内容整合到单个多租户应用程序中。皱纹是应用程序的略有不同的版本。
目前,从环境变量加载配置选项(对于公共对私有,以及一些每个实例),现在它们需要位于数据库表中并根据子域加载。
我想通过让www
子域使用公共配置和任何其他子域使用私有配置,我可以将应用配置要求“压扁”到子域多租户中,但我只是不确定如何这样做,以便我可以随时(无需请求)自由地知道它是一个还是另一个,就像我目前使用app app变量存在于app或请求上下文之外。
我已经看到了使用App Dispatching,Blueprints在Flask中实现多租户的多种策略,或者在更简单的情况下,只需设置SERVER_NAME
并使用subdomain
路由参数,但它们都是似乎假设所有租户的应用程序都是相同的。后者适用于此应用程序已配置并运行并使用子域仅使用该子域的数据,但对于应用程序级别配置似乎不够。
如何根据子域实现不同app配置的多租户?