在Flask中,有一种方法可以忽略对不存在的路由的请求

时间:2016-02-29 10:35:03

标签: python http flask

我正在使用Flask编写应用程序。 我有一套路线,他们工作。 我想在客户端做的是忽略对无效URL的任何请求。那是我不想在应用程序中呈现任何404 /错误页面。我想要一个警告说网址无效,浏览器只是停留在同一页面上。

我不想在客户端上检查JavaScript中的URL,因为这会暴露它们。

我有一条正确响应未知网址的路线:

@app.errorhandler(404) 
def non_existant_route(error):
   return jsonify({"no":"such page"})

如果删除return语句,我会收到500错误。 我不能使用abort()

这个想法是否违反了某些HTTP原则?

由于

3 个答案:

答案 0 :(得分:2)

听起来你需要一个“全能”终点。通常情况下,似乎一个catch-all端点将返回通用404,但在您的情况下,您可能希望返回带有一些上下文信息的200。这基本上是你如何做到的(信用转到http://flask.pocoo.org/snippets/57/):

from flask import Flask
app = Flask(__name__)

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    # returns a 200 (not a 404) with the following contents:
    return 'your custom error content\n'

# This is just one of your other valid routes:
@app.route('/stuff')
def stuff():
    return 'stuff\n'


if __name__ == '__main__':
    app.run()

如果你运行它并卷曲测试应用程序的各个端点,这就是你得到的:

$ curl localhost:5000/stuff
stuff
$ curl localhost:5000/foo/bar
your custom error content
$ curl localhost:5000/otherstuff
your custom error content

正如您所看到的,您的其他路线仍然可以按预期工作。

答案 1 :(得分:1)

我已经决定解决这个问题太难了!我找不到任何方法让浏览器忽略响应。 “什么都不做”没有响应头。如果有,我们可能永远不会再看到网络服务器错误,这不会很好。

我可以将所有请求作为一种方法来获取响应标头并在任何呈现或重定向发生之前对其进行分析。这开始打破所有导航(至少后退按钮)和漂亮的URL。我可以在JS路由框架等方面打瞌睡,虽然我倾向于它是如何工作的但我没有构建我的应用程序(我已经有足够的知识了!)

@app.errorhandler(404)
def page_not_found(error):
    return redirect(url_for('index'))

如果你想出一些很棒的东西,我不是第一个提出这个问题的人,可能不是最后一个问题。

由于

答案 2 :(得分:0)

我记得几天前读过一个javascript库(但我不记得这个名字......)。这个库的clou是,所有链接和表单提交都没有直接加载到浏览器&#34; _top&#34;框架/窗口,但进入一个隐藏的div,然后,完成后,页面的内容被这个隐藏的div的内容所取代。

因此,如果您想在客户端捕获不良链接等,您可以连接所有链接并提交并检查http响应代码。如果不是200(ok)则显示错误。如果可以,您可以决定是否用新内容替换旧页面。

但是这个解决方案有两个问题: 1.您必须更改浏览器位置(在地址栏中),而无需重新加载页面! 2.使用javascript发布一些文件上传可能会变得棘手。

如果我找到了我看到的js-library的链接或名称,我会告诉你的!