【问题标题】:Why non existing URL containing the sharp ("#") sign in Python/Flask aren't handled by the errorhandler为什么错误处理程序不处理 Python/Flask 中包含尖锐(“#”)符号的非现有 URL
【发布时间】:2013-12-20 14:00:03
【问题描述】:

我正在构建一个 Python/Flask(完全 ajax,无需重新加载整个页面)Web 应用程序,并且当 url 上的尖锐(“#”)符号更改 (Ben Alman, HashChange event)

我想捕获所有 Error-404 以在我的母版页中附加一个错误页面

考虑以下代码

from flask import Flask, redirect

#WebServerGatewayInterface
class WSGI():
    def __init__(self):
        self.app = Flask(__name__)
        self.app.debug = True


wsgi = WSGI()

@wsgi.app.route("/")
def Home():
    return "Home"

@wsgi.app.route("/Contact")
def Contact():
    return "Contact"

@wsgi.app.errorhandler(404)
def PageNotFound(error):
    return "PageNotFound"

if __name__ == '__main__':
    wsgi.app.run(host='127.0.0.1', port=7777)

我想了解为什么当我在尖 ("#") 符号后添加一个不存在的 URL 时,它不会被错误处理程序捕获?

例如

127.0.0.1:7777
#It returns "Home"

127.0.0.1:7777/Contact
#It returns "Contact"

127.0.0.1:7777/Aasdasdasdasd
#It returns "PageNotFound"

127.0.0.1:7777/#/asdsaasdasdasdas
#It returns "Home", which is not right since this URL doesn't exist

127.0.0.1:7777/#!/asdsaasdasdasdas
#It returns "Home", not ok...

127.0.0.1:7777/#!/Contact
#It returns "Home", not ok...

【问题讨论】:

  • 您知道 浏览器 会处理散列后的所有内容,对吧?只有 127.0.0.1:7777/ 是/应该被发送到服务器。

标签: python url routing flask


【解决方案1】:

# 之后的所有内容构成资源的fragment identifier,并由客户端处理。在正常的操作过程中,片段标识符永远不会发送到服务器:

片段标识符的功能与 URI 的其余部分不同:即,它的处理完全是客户端,没有 Web 服务器的参与

如果服务器曾经在 URL 中发送片段标识符,它必须忽略 URL 的这一部分。它不是路径的一部分,因此 Flask 只会看到 127.0.0.1:7777/ 用于所有带有片段的示例 URL。

【讨论】:

  • 好的。谢谢你提供信息。如果我使用带有错误 URL 的 $.ajax 调用来调用没有“#”的服务器,我的服务器仍然返回我的“主页”页面。为什么会这样?
  • @Tareck117:您是否100%确定该网址不是主页路径?
  • 好的!没关系,我检查了我的服务器代码,发现我的@errorhandler(404) 正在重定向到 "/#!/PageNotFound" ,因为 "#" 后面的部分没有被考虑在内。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 2019-09-26
  • 2014-01-04
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
相关资源
最近更新 更多