Часть после хеша (#
) представляет собой идентификатор фрагмента [wiki] .Как указано в статье Википедии:
Идентификатор фрагмента функционирует иначе, чем остальная часть URI: его обработка исключительно на стороне клиента без участия веб-сервера,хотя сервер обычно помогает определить тип MIME, а тип MIME определяет обработку фрагментов.Когда агент (например, веб-браузер) запрашивает веб-ресурс с веб-сервера, агент отправляет URI на сервер, но не отправляет фрагмент .Вместо этого агент ожидает от сервера отправки ресурса, а затем агент обрабатывает ресурс в соответствии с типом документа и значением фрагмента.
Таким образом, веб-сервер никогда даже не получит идентификатор фрагмента.Если вы хотите включить хеш как часть ключа строки запроса, вам нужно кодировать его с процентным кодированием [wiki] , хешкодируется в %23
.В самом деле, если вы хотите, чтобы хэш был в запросе, URI должен быть:
https://localhost:8000/?<b>%23</b>access_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']}>
Thisявляется одной из основных причин, по которой вам никогда не следует самостоятельно обрабатывать строки для кодирования строки запроса.Есть больше символов, которые должны быть закодированы, когда они являются частью ключа или значения, например !
, *
, '
, (
, )
, ;
, :
, @
, &
, =
, +
, $
, ,
, /
, ?
, [
и ]
.Хотя, строго говоря, вы можете закодировать их самостоятельно.Вероятно, более безопасно использовать инструмент, который был эффективно протестирован.