尾部斜杠在Flask路径规则中触发404

时间:2015-10-20 15:44:10

标签: python flask

我想将/users下的任何路径重定向到静态应用。以下视图应捕获这些路径并提供适当的文件(它只打印此示例的路径)。这适用于/users/users/604511/users/604511/action。为什么路径/users/会导致404错误?

@bp.route('/users')
@bp.route('/users/<path:path>')
def serve_client_app(path=None):
    return path

3 个答案:

答案 0 :(得分:89)

您的/users路由缺少一个尾部斜杠,Werkzeug将其解释为与尾部斜杠不匹配的明确规则。添加尾部斜杠,如果网址没有,Werkzeug将重定向,或者在路线上设置conflict clause,Werkzeug将匹配带有或不带斜线的规则。

@app.route('/users/')
@app.route('/users/<path:path>')
def users(path=None):
    return str(path)

c = app.test_client()
print(c.get('/users'))  # 302 MOVED PERMANENTLY (to /users/)
print(c.get('/users/'))  # 200 OK
print(c.get('/users/test'))  # 200 OK
@app.route('/users', strict_slashes=False)
@app.route('/users/<path:path>')
def users(path=None):
    return str(path)

c = app.test_client()
print(c.get('/users'))  # 200 OK
print(c.get('/users/'))  # 200 OK
print(c.get('/users/test'))  # 200 OK

您还可以为所有网址设置strict_slashes

app.url_map.strict_slashes = False

但是,在大多数情况下,应避免禁用严格斜杠。文档解释了原因:

  

此行为允许相对URL继续工作,即使省略了尾部斜杠,这与Apache和其他服务器的工作方式一致。此外,URL将保持唯一,这有助于搜索引擎避免两次索引相同的页面。

答案 1 :(得分:35)

全局禁用严格斜线;像这样设置url_map.strict_slashes = False

app = Flask(__name__)
app.url_map.strict_slashes = False

这样您就不必为每个视图使用strict_slashes=False

然后你只需定义没有尾部斜杠的路线,如下所示:

bp = Blueprint('api', __name__, url_prefix='/api')
@bp.route('/my-route', methods=['POST'])

然后/my-route/my-route/的工作方式相同。

答案 2 :(得分:9)

这是因为Werkzeug与其他HTTP服务器的一致性。看看Flask的Quickstart documentation。相关段落:

  

唯一网址/重定向行为

     

Flask的URL规则基于Werkzeug的路由模块。这个想法   该模块的背后是确保基于的美丽和唯一的URL   Apache和早期HTTP服务器规定的先例。

     

采取以下两条规则:

@app.route('/projects/') 
def projects():
    return 'The project page'

@app.route('/about') 
def about():
    return 'The about page'
     

虽然它们看起来很相似,但它们在使用时却有所不同   URL定义中的尾部斜杠。在第一种情况下,规范   项目端点的URL具有尾部斜杠。从这个意义上讲,它   类似于文件系统上的文件夹。无需访问它   尾部斜杠将导致Flask重定向到规范URL   尾随斜线。

     

但是,在第二种情况下,URL的定义没有尾随   斜杠,更像是类UNIX系统上文件的路径名。   使用尾部斜杠访问URL将产生404“未找到”   错误。

     

此行为允许相对URL继续工作,即使   尾部斜杠被省略,与Apache和其他方式一致   服务器工作。此外,URL将保持唯一,这有助于搜索   引擎避免两次索引相同的页面。

所以只需将/users/添加到路由中。