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

Jes*_*ose 62 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
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 106

您的/users路线缺少尾部斜杠,Werkzeug将其解释为与尾部斜杠不匹配的明确规则.添加尾部斜杠,如果url没有它,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
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)

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

app.url_map.strict_slashes = False
Run Code Online (Sandbox Code Playgroud)

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

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


Nic*_*ams 37

全局禁用严格斜线; 设置url_map.strict_slashes = False如下:

app = Flask(__name__)
app.url_map.strict_slashes = False
Run Code Online (Sandbox Code Playgroud)

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

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

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

然后/my-route,/my-route/两者都相同.


Dau*_*ros 10

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

唯一的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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以只需添加/users/路由.