2014-06-07 28 views
0

執行我目前有類似的燒瓶中的應用程序執行以下操作:跳過/越過視圖功能,所以接下來就可以在瓶

@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 / => 「主頁」
  • GET /test1 => 「功能:測試1」
  • GET /test/2 => 「捕獲:測試/ 2」

最終,所有這些都將由數據庫驅動。對於功能,它們將根據slug進行檢索和顯示。對於catch,它們將從數據庫加載並可能導致某些行爲,如重定向,或返回404。這些都不是問題。

我的問題是這樣的:在/test1例子,我想實現以下行爲:

  1. 嘗試在那裏塞匹配test1
  2. 如果它存在於從數據庫中加載,罰款。顯示。
  3. 如果它不存在,我想「跌倒」到catch查看功能。

點3是我不知道如何實現的部分。這似乎應該存在,但我無法在任何地方找到任何類型的「下一個匹配視圖函數」行爲。這是可能的,如果是這樣,我錯過了什麼?

回答

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 
    
+0

感謝。這非常證實我在原來的方法中沒有遺漏任何東西 - 但是在錯過了顯而易見的問題中陷入了困境。 :-) –