2013-12-20 64 views
2

我正在構建Python/Flask(完全ajax,無整頁重裝)Web應用程序,並且我更改了我的母版頁的內容時,鋒利的(「#」)在URL上改變符號(Ben Alman, HashChange event)爲什麼包含Python/Flask中的尖銳(「#」)符號的非現有URL不由錯誤處理程序處理

我想捕獲所有的錯誤-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) 

我想明白爲什麼當我在sharp(「#」)符號之後添加一個不存在的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... 
+5

你知道*瀏覽器*處理哈希後的所有內容,對嗎?只有'127.0.0.1:7777 /'應該被髮送到服務器。 –

回答

8

一切後,#形式的資源的fragment identifier並處理客戶端。在正常的操作過程中,片段標識符永遠不會發送到服務器:

片段標識符功能不同於所述URI的其餘部分,即:它的處理是專門的客戶端,沒有從網絡參與服務器

如果服務器曾經在URL中發送片段標識符,它必須忽略這部分URL。這不是路徑的一部分,因此Flask只會看到127.0.0.1:7777/的所有帶有片段的示例網址。

+0

好的。謝謝你提供信息。如果我使用帶有錯誤URL的$ .ajax調用而不使用「#」來調用我的服務器,我的服務器仍然將我返回到我的「主頁」頁面。這是爲什麼 ? – RPDeshaies

+0

@ Tareck117:你是否100%**確定該網址不是首頁路徑? –

+0

好的!沒關係,我檢查了我的服務器代碼,發現我的@errorhandler(404)正在重定向到「/#!/ PageNotFound」,因爲「#」之後的部分沒有考慮到。非常感謝您的幫助! – RPDeshaies