2016-11-01 99 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