복붙노트

[PYTHON] Flask에 양식 배열 보내기

PYTHON

Flask에 양식 배열 보내기

나는 여러 개의 입력이있는 html 폼을 가지고있다.

<input name="hello[]" type="text" />
<input name="hello[]" type="text" />
<input name="hello[]" type="text" />

PHP에서는이 배열을 배열로 가져 오지만 Flask를 사용하는 Python에서와 같은 방식입니까?

나는 이것을 시도했다 :

hello = request.form['hello']    
print hello

플라스크에서는 작동하지 않지만 "400 잘못된 요청"이 표시됩니다.

Bad Request

The browser (or proxy) sent a request that this server could not understand.

플라스크에서 어떻게합니까?

해결법

  1. ==============================

    1.필드 이름에 괄호를 추가하는 PHP 규칙을 따르고 있습니다. 이것은 웹 표준이 아니지만 PHP가 기본적으로 지원하기 때문에 대중적입니다. Ruby on Rails도이를 사용합니다.

    필드 이름에 괄호를 추가하는 PHP 규칙을 따르고 있습니다. 이것은 웹 표준이 아니지만 PHP가 기본적으로 지원하기 때문에 대중적입니다. Ruby on Rails도이를 사용합니다.

    해당 규칙을 사용하는 경우 Flask 측에서 POST 데이터를 가져 오려면 필드 이름에 대괄호를 포함해야합니다. MultiDict.getlist ()를 사용하여 목록의 모든 값을 검색 할 수 있습니다.

    hello = request.form.getlist('hello[]')
    

    물론 [] 규칙을 사용할 필요는 없습니다. []을 hello 이름에 추가하지 않으면 완벽하게 작동하며, 플라스크에서 request.form.getlist ( 'hello')를 사용하면됩니다.

  2. ==============================

    2.다차원 사전을 지원하는 구문 분석 함수를 작성했습니다. php_post = parse_multi_form (request.form)

    다차원 사전을 지원하는 구문 분석 함수를 작성했습니다. php_post = parse_multi_form (request.form)

    def parse_multi_form(form):
        data = {}
        for url_k in form:
            v = form[url_k]
            ks = []
            while url_k:
                if '[' in url_k:
                    k, r = url_k.split('[', 1)
                    ks.append(k)
                    if r[0] == ']':
                        ks.append('')
                    url_k = r.replace(']', '', 1)
                else:
                    ks.append(url_k)
                    break
            sub_data = data
            for i, k in enumerate(ks):
                if k.isdigit():
                    k = int(k)
                if i+1 < len(ks):
                    if not isinstance(sub_data, dict):
                        break
                    if k in sub_data:
                        sub_data = sub_data[k]
                    else:
                        sub_data[k] = {}
                        sub_data = sub_data[k]
                else:
                    if isinstance(sub_data, dict):
                        sub_data[k] = v
    
        return data
    

    용법:

    >>> request.form={"a[0][name]": "ahui", "a[0][sex]": "female", "a[1][name]": "bhui", "a[1][sex]": "male"}
    >>> parse_multi_form(request.form)
    {'a': {0: {'name': 'ahui', 'sex': 'female'}, 1: {'name': 'bhui', 'sex': 'male'}}}
    

    그래서 나는 list를 대체하기 위해 dict를 사용할 것을 제안한다 :

    <input name="hello[0]" type="text" />
    <input name="hello[1]" type="text" />
    

    여전히 복잡한 데이터를 게시하려면 application / json을 사용하는 것이 좋습니다.

  3. from https://stackoverflow.com/questions/24808660/sending-a-form-array-to-flask by cc-by-sa and MIT license