Python 基于子域的GAE命名空间

Python 基于子域的GAE命名空间,python,google-app-engine,namespaces,multi-tenant,Python,Google App Engine,Namespaces,Multi Tenant,我正在考虑一个多租户环境,在这个环境中,我可以让每个租户访问不同的子域,然后基于该域分配一个名称空间 比如说, tenantA.mydomain.com tenantB.mydomain.com 然后,我希望对所有租户数据使用名称空间tenata,对所有租户数据使用名称空间tenantB 从文档中,听起来我会在我的appengine\u config.py文件中完成这项工作,并执行以下操作: from google.appengine.api import namespace_manager

我正在考虑一个多租户环境,在这个环境中,我可以让每个租户访问不同的子域,然后基于该域分配一个名称空间

比如说,

tenantA.mydomain.com
tenantB.mydomain.com
然后,我希望对所有租户数据使用名称空间
tenata
,对所有租户数据使用名称空间
tenantB

从文档中,听起来我会在我的
appengine\u config.py
文件中完成这项工作,并执行以下操作:

from google.appengine.api import namespace_manager

def namespace_manager_default_namespace_for_request():

    this_namespace = get_namespace_from_subdomain()
    return this_namespace
第一个问题,这是一个合理/良好的方法吗

第二个问题,不清楚这个范围中有哪些变量可用-有没有关于如何实现get_namepsace_from_subdomain()函数的指针


最后,如果我想提供一些跨名称空间的功能,那么仍然可以通过全局名称空间来实现吗?例如,假设一个用户在多个租户中拥有一个帐户,我想查看他在所有租户中的活动。

我认为这不是最好的方法。这种方法的问题在于,在某种程度上,应用程序与基础架构紧密耦合。域和子域只是访问绑定到特定ip地址的机器的一种更简单的方法。我会将域名归类为基础设施的一部分,而不是应用程序的一部分。如果您使用上述方法,您将在应用程序中引入一些关于基础架构的知识,从而降低应用程序的灵活性。如果出于某种原因,您在将来某个时候决定您的客户A应该使用clientA.mydomain.com,会发生什么情况?或者keyClientA.myotherdomain.com怎么样?或者您希望允许您的客户A使用其域名,即support.clientA.com,怎么样?如果您的应用程序对域和基础结构设置一无所知,那么只需重新配置DNS服务器并获得可移植性就容易多了


如果我有这个场景,我会将URL映射到租户id,然后将该租户id用作命名空间名称。通过这种方式,您可以轻松地将不同的URL映射到租户id。您甚至可以将多个URL映射到同一租户id,并在多个URL上公开同一应用程序。映射可以存储在一个简单的配置文件中,甚至可以存储在全局命名空间中的AppEngine数据存储本身中。如果配置存储在AppEngine数据存储中,您可以使用应用程序的管理部分(甚至另一个AppEngine模块)实时更新配置。

我认为这不是最好的方法。这种方法的问题在于,在某种程度上,应用程序与基础架构紧密耦合。域和子域只是访问绑定到特定ip地址的机器的一种更简单的方法。我会将域名归类为基础设施的一部分,而不是应用程序的一部分。如果您使用上述方法,您将在应用程序中引入一些关于基础架构的知识,从而降低应用程序的灵活性。如果出于某种原因,您在将来某个时候决定您的客户A应该使用clientA.mydomain.com,会发生什么情况?或者keyClientA.myotherdomain.com怎么样?或者您希望允许您的客户A使用其域名,即support.clientA.com,怎么样?如果您的应用程序对域和基础结构设置一无所知,那么只需重新配置DNS服务器并获得可移植性就容易多了


如果我有这个场景,我会将URL映射到租户id,然后将该租户id用作命名空间名称。通过这种方式,您可以轻松地将不同的URL映射到租户id。您甚至可以将多个URL映射到同一租户id,并在多个URL上公开同一应用程序。映射可以存储在一个简单的配置文件中,甚至可以存储在全局命名空间中的AppEngine数据存储本身中。如果配置存储在AppEngine数据存储中,您可以使用应用程序的管理部分(甚至另一个AppEngine模块)实时更新配置。

我认为这不是最好的方法。这种方法的问题在于,在某种程度上,应用程序与基础架构紧密耦合。域和子域只是访问绑定到特定ip地址的机器的一种更简单的方法。我会将域名归类为基础设施的一部分,而不是应用程序的一部分。如果您使用上述方法,您将在应用程序中引入一些关于基础架构的知识,从而降低应用程序的灵活性。如果出于某种原因,您在将来某个时候决定您的客户A应该使用clientA.mydomain.com,会发生什么情况?或者keyClientA.myotherdomain.com怎么样?或者您希望允许您的客户A使用其域名,即support.clientA.com,怎么样?如果您的应用程序对域和基础结构设置一无所知,那么只需重新配置DNS服务器并获得可移植性就容易多了


如果我有这个场景,我会将URL映射到租户id,然后将该租户id用作命名空间名称。通过这种方式,您可以轻松地将不同的URL映射到租户id。您甚至可以将多个URL映射到同一租户id,并在多个URL上公开同一应用程序。映射可以存储在一个简单的配置文件中,甚至可以存储在全局命名空间中的AppEngine数据存储本身中。如果配置存储在AppEngine数据存储中,您可以使用应用程序的管理部分(甚至另一个AppEngine模块)实时更新配置。

我认为这不是最好的方法。这种方法的问题在于,在某种程度上,应用程序与基础架构紧密耦合。域和子域只是访问绑定到特定ip地址的机器的一种更简单的方法。我会将域名归类为基础设施的一部分,而不是
tenantB.mydomain.com/?tenant=tenantA => namespace=tenantA