首页 文章

如何使用Python中的Flask从%20和URL中分别读取参数?

提问于
浏览
0

我有以下网址:

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

当我使用Flask方法时:

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

它只返回字符串"New Haven CT",实际上将 %20+ 都转换为空格

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

1 回答

  • 0

    如果你真的想用 + 分隔参数 . 您可以自己解析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 ''
    

    并且有一种简单的方法,如果你可以像 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']}
    

相关问题