使用Flask和App引擎的多租户应用程序

时间:2013-08-27 05:56:15

标签: python google-app-engine flask multi-tenant

我正在使用Flask和App Engine实施多租户应用。我正在使用子域作为我的命名空间(App引擎的命名空间)。以下是我的设计:

当用户访问test.domain.com时,我将检查子域'test'是否在SudDomain模型中,如下所示:

class SubDomain: # subdomain stored as id
    pass 

如果SubDomain中存在'test',则用户将被重定向到应用程序的登录页面,并且应用程序的当前名称空间将设置为'test'。否则,将显示注册页面。

如何在生产和开发环境中实施它?我想做如下:

在制作中:

使用before_request装饰器,我会这样做:

from urllib2 import urlparse
from flask import request

url_info = urlparse.urlparse(request.url) # Say, http://test.domain.com
subdomain = url_info.netloc.split(".")[0]

可以针对SubDomain模型检查此子域,并将遵循其余步骤。

在开发中:

我不知道如何实现这种情况。我在想的是: 请求将采用http://localhost:8888/test/list/的形式,此处'test'被视为子域。在before_request装饰器中将以某种方式删除,以便修改后的请求看起来像http://localhost:8888/list/,这将导致正确的端点。在烧瓶中可以这样做吗?

然后,将在SubDomain模型中检查提取的子域 - 'test'。

我是以正确的方式做到的吗?我的方法中有什么问题,尤其是本地开发环境中的问题吗?

BTW,这是我的第一个多租户应用程序,请耐心等待。

提前致谢..

1 个答案:

答案 0 :(得分:3)

我做了类似于你在这里所做的事情,但最终只需要在你的/ etc / hosts文件中添加内容就可以了。

我做的第一次尝试就像你的那样,并根据环境改变路由器来实现。然后反向路由构建器很容易创建它,但随着它的增长,你必须支持dev / live路由的两倍,这很容易做但只是不值得麻烦。

因此,只需修改您的主机文件,添加您要测试的域名。

# on Linux/Unix at /etc/hosts
127.0.0.1 www.example.dev sub1.example.dev sub2.example.dev

# on windows its in system32\drivers\etc\

如果您使用的是linux / mac,您还可以安装dnsmasq,您只需为开发工作定义一个完整的扩展名即可。例如,我的所有.dev都指向localhost,如www.example.dev

这样您只需为.com - >域名路由制作变量即可。 .dev关于生产和发展。

然后您可以在http://www.example.dev:8888/

开始访问appengine dev服务器