2016-02-29 130 views
2

我正在使用Flask编写应用程序。 我有一套路线,他们工作。 我想在客户端执行的操作是忽略对无效URL的任何请求。这是我不想在应用程序中呈现任何404 /错误页面。我想要一个提醒,说该网址无效,浏览器只需保持在同一页面上。In Flask有没有办法忽略不存在的路由请求

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

我有一个正确响应未知的URL路径:

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

如果我删除return语句,我得到一个500错误。 我不能使用中止()

这个想法违反了一些HTTP原则吗?

感谢

+0

你确定这有效吗?这不是有效的Python。 – dirn

+0

@dirn代码片段是一个Flask路由。什么是无效的?它有什么不同? def必须返回一些东西,否则浏览器会显示一个500 ERROR,这正是我想要的一个解决方案 – knowingpark

+0

''在Python标识符中无效,在这种情况下是函数名称。 – dirn

回答

0

我记得曾读到一个JavaScript库的一些天前(但我不记得名字了......)。与此库的中心思想是,所有的链接和表单提交加载不直接进入浏览器“_top”帧/窗口,但到一个隐藏的div事后,完成后,页面内容被这个隐藏的内容替换DIV。

所以,如果你想赶上不好的链接,这样在客户端,你可以挂钩的所有链接,并提交和检查HTTP响应代码。如果它不是200(好),你会显示一个错误。如果你决定,如果你用新内容替换旧页面。

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

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

0

我决定解决这个问题太难了!我找不到任何让浏览器忽略响应的方法。没有做任何事情的响应头。如果有的话,我们可能再也不会看到一个web服务器错误,这不太好。

我可以ajaxify所有请求,以此来抓住响应头和任何渲染或重定向发生之前对它们进行分析。这开始打破所有的导航(至少后退按钮)和漂亮的URL。我能塞子在JS路由框架等,虽然我倾向于它是如何工作的,我不建立我的应用程序(我已经有足够的学习!)

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

如果你拿出一些伟大的职位无论如何,我不是第一个问这个问题的人,也可能不是最后一个。

感谢

1

这听起来像你需要一个“包罗万象”的端点。通常情况下,它似乎是一个包罗万象的端点会返回一个通用的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 

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

相关问题