我正在使用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,这是我的第一个多租户应用程序,请耐心等待。提前致谢..
答案 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关于生产和发展。
开始访问appengine dev服务器