Daily Develope

[FLASK] request 정리 본문

Develope/Web

[FLASK] request 정리

noggame 2022. 8. 16. 13:32

flask에서 데이터 읽기

사용자가 데이터를 싣어보내는 방법이 다양하기에, 규격(유형)에 맞는 데이터 읽기 방법을 구현해야한다.

샘플코드

- Get 요청 : request.args 로 데이터 전달

- Post 요청 : request.form 으로 데이터 전달

- 입력 유형(format)에 따라 데이터 구분 가능 (request.content_type)

from flask import request

#...

@sample.route('/', methods=['GET', 'POST'])
def sampleAPI():

#    ...

    contentType = request.content_type # 또는 contentType = request.headers.get('Content-Type')
    args = None

    if request.method == "GET":
        args = request.args

    elif request.method == "POST":
        try:
            # form
            if contentType == "application/x-www-form-urlencoded":
                args:dict = request.form
            # json
            elif contentType == "application/json":
                args:dict = request.json
            else:
                print("not supported content-type")

        except:
            print("bad request")

    data1 = args.get('data1')
    data2 = args.get('data2')

#    ...

데이터 유형별 Flask의 request 데이터 포맷

request.args : URL 문자열 쿼리에 정의된 키/값 쌍의 데이터를 읽는 경우 사용
request.form : HTML POST 요청 Body 속 키/값 쌍이나, JSON으로 인코딩되지 않은 JavaScript 요청의 데이터를 읽는 경우 사용
request.files : HTML POST 요청 Body 속 파일이며, enctype=multipart/form-data 이거나 업로드가 불필요한 파일인 경우 사용
request.values : args와 form이 복합적으로 사용된 데이터를 읽는 경우 사용
request.json : contentType이 application/json으로 정의된, JSON 데이터를 읽는 경우 사용

참고) curl 요청 예시

# args 요청
curl -X GET http://mydomain.com?data1=value1&data2=value2

# form 요청
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "data1"="value1" -d "data2"="value2" http://mydomain.com

# json 요청
curl -X POST -H "Content-Type: application/json" -d '{"data1":"value1","data2":"value2"}' http://mydomain.com

데이터 전송 종류별 읽는 방법

1. Path

용도 : 세부 데이터 분류를 지정하기 위해 주로 사용
유형 : Flask의 route 주소 정보 참조 가능

# 사용 예 (특정 회원의 정보 조회)
http://mydomain.com/{user_id}/info

2. Query

용도 : URL에 데이터 이름과 값을 실어 보낸다 (데이터가 노출되기에 공개 가능한 간단한 정보를 실어보내는 용도에 적합)
유형 : request.args 를 사용해 데이터 읽기 가능

# 아래 예시와 같이 데이터가 들어오는 경우
curl -X GET http://mydomain.com?data1=value1&data2=value2

3. Body

용도 : 개인정보 등 보안상 노출되면 안되는 정보를 전달을 위해 주로 사용

유형 : JSON 이외의 유형, request.form 을 사용해 데이터 읽기 가능

# 아래 예시와 같이 데이터가 들어오는 경우
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "data1"="value1" -d "data2"="value2" http://mydomain.com

유형 : JSON 데이터, request.json 을 사용해 데이터 읽기 가능

# 아래 예시와 같이 데이터가 들어오는 경우
curl -X POST -H "Content-Type: application/json" -d '{"data1":"value1","data2":"value2"}' http://mydomain.com

Error Handling

request.json 호출시, body에서 json 데이터를 찾을 수 없다는 예외(Exception)가 발생하는 경우

request.json 데이터가 존재하는지 확인하기 위해서 get_json() method를 사용해 데이터 읽도록 구현 - 참조

args = request.get_json(silent=True, cache=False)

if args:
    # processing to get data
    ...
Comments