【问题标题】:How do I separately read arguments with %20 & + from URL using Flask in Python?如何在 Python 中使用 Flask 从 URL 中分别读取带有 %20 & + 的参数?
【发布时间】:2018-12-09 11:38:46
【问题描述】:

我有以下网址:

https://ide50-username.cs50.io/search?q=New%20Haven+CT

当我使用 Flask 方法时:

q = request.args.get("q")

它只是返回字符串“New Haven CT”,基本上将%20+ 都转换为空格

我想从我的 URL 中分别读取参数“New Haven”和“CT”作为列表中的两个项目。我该怎么做?

【问题讨论】:

  • %20 和 + do 都表示 URL 中的空格;如果那应该是文字字符 + 它需要进行 URL 编码。

标签: python url flask url-parsing


【解决方案1】:

如果你真的想用+ 分隔参数。你可以自己解析URL。(警告:它不如urllib.parse.parse_qs安全。)

urllib.parse.unquote 函数不会将+ 解析为空格,urllib.parse.unquote_plus 会。 See the docs.

一个例子:

from urllib.parse import unquote


def parse_query_string(query_string):
    pairs = [s2 for s1 in query_string.split('&') for s2 in s1.split(';')]
    parse_result = {}
    for pair in pairs:
        name_value = pair.split('=', 1)
        if len(name_value) != 2:
            continue
        if len(name_value[1]):
            name = unquote(name_value[0])
            _value = unquote(name_value[1])

            # separate value with +
            values = _value.split('+')
            if name in parse_result:
                parse_result[name].extend(values)
            else:
                parse_result[name] = values
    return parse_result


@app.route('/search')
def search():
    # Get raw query_string
    raw_query_string = request.query_string.decode()
    queries = parse_query_string(raw_query_string)
    q = queries.get('q')
    return ''

还有一个简单的方法,如果你可以将 url 设为 q=New%20Haven&q=CT,Flask 可以将 q 解析为多个值。

print(request.args)
# output: ImmutableMultiDict([('q', 'New Haven'), ('q', 'CT')])

或者使用urllib.parse.parse_qs自行解析。

raw_query_string = request.query_string.decode()
print(parse_qs(raw_query_string))
# output: {'q': ['New Haven', 'CT']}

【讨论】:

    猜你喜欢
    • 2014-12-05
    • 2020-12-15
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    相关资源
    最近更新 更多