如何在Flask应用程序中创建动态子域

时间:2013-05-28 23:29:36

标签: python heroku routes flask url-routing

我正在尝试在Flask应用程序中设置变量路由处理,如本答案中所述:Dynamic Subdomain Handling in a Web App (Flask)

但是,我希望能够识别某些子域名之前它们被变量路由捕获,因此我可以使用flask-restful api扩展名(Routing with RESTful)。

例如,我尝试了以下内容:

@app.route('/', subdomain="<user>", defaults={'path':''})
@app.route('/<path:path>', subdomain="<user>")
def user_profile(user,path):
    pass

class Api(restful.Resource):
    def get(self):
        #Do Api things.

api.add_resource(Api, '/v1', subdomain="api")

当我对此进行测试时,所有URL都会转到变量路由处理程序并调用user_prof()。我尝试将api路由放在第一位,将标准@app.route规则放在第二位,反之亦然,但没有任何变化。

我是否遗漏了其他一些参数,或者需要深入Flask才能实现这一目标?

更新

我想要匹配的网址格式如下:

user1.mysite.com -> handled by user_profile()
user2.mysite.com -> handled by user_profile()
any_future_string.mysite.com -> handled by user_profile()
api.mysite.com/v1 -> handled by Api class

其他情况包括:

www.mysite.com -> handled by index_display()
mysite.com -> handled by index_display()

2 个答案:

答案 0 :(得分:0)

@app.before_request
def before_request():
    if 'api' == request.host[:-len(app.config['SERVER_NAME'])].rstrip('.'):
        redirect(url_for('api'))


@app.route('/', defaults={'path': ''}, subdomain='api')
@app.route('/<path:path>', subdomain='api')
def api(path):
    return "hello"

这应该有效。如果需要,可以将api版本添加到路径中,或者可以由API类处理。

答案 1 :(得分:0)

为了简单起见,我将应用程序的逻辑重新设计为两个不同的部分。

这样Flask应用程序只处理API端点逻辑。用户配置文件逻辑由另一个应用程序处理。我现在可以向API应用程序添加多个资源,而无需担心破坏路由。