我想将/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
答案 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/
添加到路由中。