跳过/传递视图功能,以便下一个可以在Flask中执行

时间:2014-06-07 13:52:18

标签: python flask

我有一个Flask应用程序,目前有以下内容:

@app.route('/')
def home():
    return "homepage"

@app.route('/<slug>')
def feature(slug):
    return "feature: " + slug

@app.route('/<path:url>')
def catch(url):
    return "catch: " + url

这适用于以下情况:

  • GET / =&gt; &#34;主页&#34;
  • GET /test1 =&gt; &#34;功能:test1&#34;
  • GET /test/2 =&gt; &#34; catch:test / 2&#34;

最终,所有这些都将由数据库驱动。对于功能,将根据slug检索和显示它们。对于catch,它们将从数据库加载,并可能导致某些行为,例如重定向或返回404.这都不是问题。

我的问题是:在/test1示例中,我希望达到以下行为:

  1. 尝试从slug匹配test1
  2. 的数据库加载
  3. 如果存在,那很好。显示。
  4. 如果它不存在,我想&#34;堕落&#34;到catch查看功能。
  5. 第3点是我不知道如何实现的部分。它似乎应该存在,但我无法找到任何类型的&#34;直到下一个匹配的视图函数&#34;行为随处可见这是可能的,如果是的话,我错过了什么?

1 个答案:

答案 0 :(得分:2)

您希望对路线使用条件逻辑 - 它可能不是路线的最佳点。

然而:

  1. 您可以根据条件呼叫另一条路线,但在某些情况下,此呼叫和直接路线呼叫的request字段可能不同:

    @app.route('/<slug>')
    def feature(slug):
        if slug_in_database(slug):
            return "feature: " + slug
        return catch(slug)
    
    @app.route('/<path:url>')
    def catch(url):
        return "catch: " + url
    
  2. 使用右request对象的解决方案:

    @app.route('/<slug>')
    def feature(slug):
        if slug_in_database(slug):
            return "feature: " + slug
        with app.test_request_context(url_for('catch', url=slug))
            return catch(slug)
    
    @app.route('/<path:url>')
    def catch(url):
        return "catch: " + url
    
  3. 但我喜欢条件:

    @app.route('/<path:url>')
    def feature_or_catch(url):
        slug  = url
        if '/' not in slug and slug_in_database(slug):
            return "feature: " + slug
        return "catch: " + url