簡體   English   中英

將 x-www-form-urlencoded 查詢字符串轉換為字典

[英]Converting x-www-form-urlencoded query string to a dict

給定來自 x-www-form-urlencoded 表單數據的查詢字符串。

data[foo]=bar&data[bar]=baz

我想把它翻譯成一個 Python 字典,比如

{'data': {'foo': 'bar', 'bar': 'baz'}}

或者接近那個的東西。 基本上,類似於在 PHP 的 $_POST 變量中處理此表單數據的方式:

Array
(
    [data] => Array
        (
            [foo] => bar
            [bar] => baz
        )

)

但是 urlparse.parse_qs() 只是給了我:

{'data[bar]': ['baz'], 'data[foo]': ['bar']}

這不是世界末日。 我可以輕松地將 dict 中的值稱為data[bar]或其他任何內容。 我想我只是有點驚訝沒有一個模塊來執行這種解析,至少我能找到。 有人知道嗎?

額外的問題:Python 中不存在這樣的庫可能是有原因的,例如 PHP 將表單數據轉換為多層數組的方式是錯誤的?

目前使用它手動將其轉換為“真實”python dict 但是,仍然可能存在我尚未遇到的未知問題。

from urllib.parse import parse_qs

str_raw_data = str(bytes_raw_data, 'utf-8')   # bytes to string

formatted_data_dict = parse_qs(str_raw_data)
data = {}
for k, v in formatted_data_dict.items():
    if len(v) == 1:
        data[k] = v[0]
    else:
        data[k] = v

return data
  • PHP 自動將索引表單變量解碼為深層數組。 PHP文檔
  • 這是 php 功能,而不是 http 或 web 標准。
  • 因為 HTTP RFC 中沒有定義通用的“數組”結構。
  • 而且,使用 [] 或其他非字母數字字符作為 key-string 確實是一個壞習慣

所以,我們最好只使用 flat key=value 格式

  • 或者嘗試通過用戶定義的數據格式(如 PHP 那樣)為客戶端和服務器端編碼/解碼多級數組。
  • 如果您提供具有這種用戶定義格式的 http api,您必須向您的客戶解釋很多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM