如何在Django中获取整个当前URL

时间:2019-09-22 11:10:48

标签: python django

在Django中获取当前网址有些麻烦。 当前网址为“ https://localhost:8000/?#access_token=EAAJ0Dqh2BJ0BABNKWfkqmiIr3uWwKvpkVeCAVQTZBQSEFG87GKjXunsoofixxKS11ZCicElsZBRMKHL4Dk5nGeBa5lBkYvzw3YKrzZAyZAvhlvd1pAtxzZBPlD4PJaD7JFz4UCjOEIyo5ZCfyBIysva1PCK0XZAN7FpXCDRpDxlEVxtnN9RrbZAt26ZChHV3LRupoZD&data_access_expiration_time=1576926047&expires_in=7153

我使用了几种URL获取功能,例如request.get_full_path()和request.build_absolute_uri(),但它们只返回了'https://localhost:8000'

如何获取'#'之后的字符串,例如access_token?

1 个答案:

答案 0 :(得分:1)

哈希(#)之后的部分是fragment identifier [wiki]。如Wikipedia文章中所述:

  

片段标识符的功能不同于URI的其余部分:其片段处理完全是客户端操作,尽管Web服务器通常可以帮助确定MIME类型,但该服务器通常不参与Web服务器的参与。 MIME类型确定片段的处理。当代理(例如Web浏览器)从Web服务器请求Web资源时,代理将URI发送到服务器,但不发送片段。相反,代理程序等待服务器发送资源,然后代理程序根据文档类型和片段值来处理资源。

因此,网络服务器甚至都不会获得片段标识符。如果要将哈希作为查询字符串的关键字的一部分包含在内,则需要使用percent-encoding [wiki]对它们进行编码,将哈希编码为%23。确实,如果您希望哈希值位于querydict中,则URI应该为:

https://localhost:8000/?%23access_token=EAAJ0Dqh2BJ0BABNKWfkqmiIr3uWwKvpkVeCAVQTZBQSEFG87GKjXunsoofixxKS11ZCicElsZBRMKHL4Dk5nGeBa5lBkYvzw3YKrzZAyZAvhlvd1pAtxzZBPlD4PJaD7JFz4UCjOEIyo5ZCfyBIysva1PCK0XZAN7FpXCDRpDxlEVxtnN9RrbZAt26ZChHV3LRupoZD&data_access_expiration_time=1576926047&expires_in=7153

如果我们生成此类URI,则Django会将其解析为:

>>> QueryDict('%23access_token=EAAJ0Dqh2BJ0BABNKWfkqmiIr3uWwKvpkVeCAVQTZBQSEFG87GKjXunsoofixxKS11ZCicElsZBRMKHL4Dk5nGeBa5lBkYvzw3YKrzZAyZAvhlvd1pAtxzZBPlD4PJaD7JFz4UCjOEIyo5ZCfyBIysva1PCK0XZAN7FpXCDRpDxlEVxtnN9RrbZAt26ZChHV3LRupoZD&data_access_expiration_time=1576926047&expires_in=7153')
<QueryDict: {'#access_token': ['EAAJ0Dqh2BJ0BABNKWfkqmiIr3uWwKvpkVeCAVQTZBQSEFG87GKjXunsoofixxKS11ZCicElsZBRMKHL4Dk5nGeBa5lBkYvzw3YKrzZAyZAvhlvd1pAtxzZBPlD4PJaD7JFz4UCjOEIyo5ZCfyBIysva1PCK0XZAN7FpXCDRpDxlEVxtnN9RrbZAt26ZChHV3LRupoZD'], 'data_access_expiration_time': ['1576926047'], 'expires_in': ['7153']}>

这是为什么您永远不要对自己进行字符串处理以编码查询字符串的主要原因之一。当它们是键或值的一部分时,应该编码更多的字符,例如!*'(),{ {1}},;:@&=+$,{{1 }},,/?。尽管严格来说,您可以自己对它们进行编码。使用经过有效测试的工具可能更安全。