【问题标题】:How to create dynamic subdomains in a Flask application如何在 Flask 应用程序中创建动态子域
【发布时间】:2013-05-24 01:56:45
【问题描述】:

我正在尝试在 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 中更深入地实现这一点?

更新:

我尝试匹配的 URL 模式是这样的:

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()

【问题讨论】:

    标签: python heroku routes flask url-routing


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      @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 版本添加到路径中。

      【讨论】:

      • 这解决了 API 处理问题,谢谢。但是,当在 API 类之外添加更多路由时,它似乎会变得非常脆弱。我决定整体简化应用逻辑。
      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多