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

问题描述 投票:52回答:3

我想将/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
python flask
3个回答
90
投票

你的/users路线缺少一个尾部斜线,Werkzeug将其解释为与尾随斜线不匹配的明确规则。添加尾部斜杠,如果网址没有,Werkzeug将重定向,或者在路由上设置strict_slashes=False,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将保持唯一,这有助于搜索引擎避免两次索引相同的页面。


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/都工作相同。


9
投票

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

唯一的URL /重定向行为

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

采取以下两条规则:

@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/添加到路由中。

© www.soinside.com 2019 - 2024. All rights reserved.