我有一个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
示例中,我希望达到以下行为:
test1
catch
查看功能。第3点是我不知道如何实现的部分。它似乎应该存在,但我无法找到任何类型的&#34;直到下一个匹配的视图函数&#34;行为随处可见这是可能的,如果是的话,我错过了什么?
答案 0 :(得分:2)
您希望对路线使用条件逻辑 - 它可能不是路线的最佳点。
然而:
您可以根据条件呼叫另一条路线,但在某些情况下,此呼叫和直接路线呼叫的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
使用右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
但我喜欢条件:
@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