当前位置: 首页 > 知识库问答 >
问题:

尾部斜杠触发烧瓶路径规则中的404

吴刚毅
2023-03-14

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

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

共有3个答案

和弘博
2023-03-14

这是因为Werkzeug与其他HTTP服务器的一致性。查看Flask的快速入门文档。有关段落:

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定义中使用尾随斜杠的方式有所不同。在第一种情况下,projectsendpoint的规范URL后面有一个斜杠。从这个意义上讲,它类似于文件系统上的文件夹。不带尾随斜杠访问它将导致Flask重定向到带尾随斜杠的规范URL。

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

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

因此,只需将/users/添加到路由中即可。

笪建章
2023-03-14

全局禁用严格的斜杠;设置url\u映射。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/两种方法的工作原理相同。

仲孙子辰
2023-03-14

您的/users路由缺少尾部斜杠,Werkzeug将其解释为与尾部斜杠不匹配的显式规则。添加尾随斜杠,如果url没有,Werkzeug将重定向,或者在路由上设置strict\u 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

您还可以为所有URL设置严格的斜杠。

app.url_map.strict_slashes = False

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

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

 类似资料:
  • 问题内容: 例如,采取以下两条路线。 根据文档,可以理解以下内容: 在第一种情况下,对路线的请求将返回404响应。已验证。 在第二种情况下有效,并将重定向到 我想看到的行为是 “逆” 的 情况下,两个 行为。例如将重定向到而不是其他方式。有没有办法定义采取此行为的途径? 根据我的理解,可以在路由上设置有效地获得第一种情况下第二种情况下的相同行为,但是我想做的是获得重定向行为,以始终将其重定向到UR

  • 我正在阅读Flask quickstart指南,但是使用变量进行路由的示例对我来说并不适用。 http://127.0.0.1:5000/user/bob重定向到http://127.0.0.1:5000/user/bob/给我一个404 我还尝试了与指南中完全相同的代码。我的第一个要点中的错误是意料之中的吗?快速入门版本中的代码应该工作吗?还是我误解了什么? 我使用的是Python 2.7.10

  • 问题内容: 自从我开始解决这个问题已经有几个小时了,我似乎无法解决这个问题。 我有一个可能会导致用户实际输入URL的应用程序。在这种情况下,不难相信用户可能会输入斜杠。例如, www.example.com/users/2和www.example.com/edit/company/123 应该与 www.example.com/users/2/和www.example.com/edit/compa

  • 斜杠的数目可以是任意数目。如何在java中规范化路径,比如:

  • 我正在使用OpenShift 4.3,我已经创建了带有主机名和路径的路由,如下所示 我使用 启动应用程序,它可以正确启动应用程序,但是如果我删除尾部斜杠并使用 它不起作用,它会给出应用程序不可用 即使我没有附加/到路由,我也希望启动应用程序。有办法吗?因为在OpenShift 3.11中,我们使用的是入口,它完全按照我们想要的方式工作。

  • 我有一个Spring Boot1.3应用程序,其中server.contextpath=/ts处于开发模式。 在浏览器中,我可以访问http://localhost:8888/ts或http://localhost:8888/ts/ 谢了。