Как отдельно прочитать аргументы с% 20 & + из URL, используя Flask в Python? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующий URL:

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

Когда я использую метод Flask:

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

, он просто возвращает мне строку "New Haven CT", по сути, конвертируя %20 & + в пустое пространство

Я хочу прочитать аргументы" New Haven "и" CT "из моего URL отдельно как два элемента в списке.как мне это сделать?

1 Ответ

0 голосов
/ 09 декабря 2018

Если вы действительно хотите разделить аргументы с помощью +.Вы можете разобрать URL самостоятельно. (Предупреждение: это не так безопасно, как urllib.parse.parse_qs.)

urllib.parse.unquote функция не разбирает + на пробел, urllib.parse.unquote_plus делает. См. Документы .

Пример:

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']}
...