2016-11-01 95 views
6

以下面兩條路線爲例。Flask路線中的尾部斜線

app = Flask(__name__) 

@app.route("/somewhere") 
def no_trailing_slash(): 
    #case one 

@app.route("/someplace/") 
def with_trailing_slash(): 
    #case two 

根據the docs以下理解:

  • 在情況下,一個,用於路線"/somewhere/"的請求將返回404響應。 "/somewhere"有效。

  • 萬一二,"/someplace/"是有效的,"/someplace"會重定向到"/someplace/"

我想看到的行爲是「逆」的情況下,兩個行爲。例如"/someplace/"將重定向到"/someplace"而不是其他方式。有沒有辦法來定義一個路線來採取這種行爲?

從我的理解,strict_slashes=False可以在路線上設置有效地得到萬一有情況下,兩個相同的行爲,但我希望做的就是重定向行爲總是重定向到URL 沒有尾部的斜線。

我想過的一種解決方案是使用404錯誤處理程序,就像這樣。 (不知道這是否會甚至工作)

@app.errorhandler(404) 
def not_found(e): 
    if request.path.endswith("/") and request.path[:-1] in all_endpoints: 
     return redirect(request.path[:-1]), 302 
    return render_template("404.html"), 404 

但我不知道是否有更好的解決方案,就像某種類型的插入式應用配置,類似於strict_slashes=False,我可以在全局範圍。也許一個藍圖或網址規則?

+0

同時實現seperately並有'/ somplace /'重定向到'/ someplace'? – Busturdust

+0

我注意到當你在Flask配置中有'DEBUG = True'時,尾部空格不會被重定向,但當'DEBUG = False'時,它會被重定向。 –

+0

@Busturdust可能可以工作,但會是一種痛苦的管理。我有一些其他想法涉及使用[錯誤處理程序](http://flask.pocoo.org/docs/0.11/patterns/errorpages/#error-handlers),如果存在無斜槓端點,則返回重定向。也可以使用某種藍圖。但是我已經使用了404錯誤處理程序來處理其他事情(它可以被烘烤,但我寧願不),我不確定是否可以通過藍圖實現。理想的解決方案是像全球網址規則一樣的投入。 – sytech

回答

11

您正在使用strict_slashes進行正確的跟蹤,您可以在Flask應用程序本身上進行配置。這將設置strict_slashes標誌False爲創建

app = Flask('my_app') 
app.url_map.strict_slashes = False 

然後你可以使用before_request檢測後/對重定向每路線。使用before_request將讓你不需要特殊的邏輯被應用到每個路由單獨

@app.before_request 
def clear_trailing(): 
    from flask import redirect, request 

    rp = request.path 
    if rp != '/' and rp.endswith('/'): 
     return redirect(rp[:-1]) 
+0

當然,我有這個想法。但是,這將重定向到URL *,並帶有*後面的斜槓。非尾隨斜線的請求將是302重定向。我希望將尾部斜槓重定向到非尾部斜槓URL。 – sytech

+1

@sytech查看我的更新 – Wondercricket

+1

看起來很有趣。這可能適用於解決方案。如果我採取這種方法,我可能會首先檢查是否存在斜線* less *路線,然後重定向到那裏,以避免重定向到最終將成爲404的URL。但是,這看起來不錯。我不確定我是如何感覺註冊一個函數來爲每條路線*運行*。我正在權衡使用404錯誤處理程序,它將檢查是否存在無斜線路由,我認爲這隻在發生404時纔會運行,並且與此相比可能會或可能沒有性能影響。 – sytech