1

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

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

class SubDomain: # subdomain stored as id
    pass 

如果子域中有'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/,这里的“测试”被视为子域。装饰器中的哪个before_request将被删除,以便修改后的请求看起来像这样http://localhost:8888/list/,这将导致正确的端点。在烧瓶中可以这样做吗?

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

我是否以正确的方式做这件事?我的方法有问题吗,尤其是本地开发环境中的方法?

顺便说一句,这是我的第一个多租户应用程序,请多多包涵。

提前致谢..

4

1 回答 1

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 都指向本地主机,例如 www.example.dev

这样,您只需在生产和开发中从 .com -> .dev 为您的域路由创建一个变量。

然后您可以开始访问您的 appengine 开发服务器http://www.example.dev:8888/

于 2013-08-27T18:26:57.350 回答