为什么包含Python / Flask中的尖锐("#")符号的现有URL不会被错误处理程序处理

时间:2013-12-20 14:00:03

标签: python url routing flask

我正在构建一个Python / Flask(完全ajax,没有完整页面重新加载)Web应用程序,当网址上的尖锐(“#”)符号更改(Ben Alman, HashChange event)时,我会更改母版页的内容/ p>

我想捕获所有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时,它不会被错误处理程序所困?

E.g。

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...

1 个答案:

答案 0 :(得分:9)

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

  

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

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