Python

[Flask] 요청(Request) 데이터 접근

비번변경 2022. 9. 23. 22:30

Request

Flask에서 요청 데이터에 접근할 때는 Request의 하위 클래스인 flask.request 모듈을 사용한다. 요청 데이터를 파싱 하여 전역 객체로 데이터를 접근하게 해 주며, 내부적으로 다중 스레드 환경에 있더라도 활성화된 요청 스레드에 대해 적절한 데이터를 얻는 것을 보장한다.

 

2022.09.17 - [Flask] REST API 만들기에서 요청 데이터에 접근하는 방법에 대해 별다른 설명이 없었는데, 아무래도 간단히 적어두는 것이 좋을 것 같아 정리한다.

 

요청 데이터에 접근하여 그 값을 텍스트 또는 JSON 형식으로 응답해보자.

 

 

reqeust 모듈 import

flask.request 모듈을 사용하기 위해서 먼저 모듈을 import 해야 한다.

from flask import request

 

 

요청 메서드 접근

요청 메서드는 request.method 속성으로 사용할 수 있다.

@app.route('/method', methods=['GET', 'POST'])
def echo_method():
    return request.method, 200

요청 메서드 접근

 

form data 접근

웹의 form을 통해 전달된 데이터는 request.form 속성으로 사용할 수 있다.

@app.route('/login', methods=['POST', 'GET'])
def login():
    if request.method == 'POST':
        response = {"username": request.form['username']}
        return jsonify(response)

    return Response('Unauthorized', 401)

form에 접근하는 키가 존재하지 않으면 KeyError가 발생하며, 별도의 예외처리를 하지 않았다면 HTTP 400을 반환한다.

 

httpie form data 요청

http -f POST <URL> <key=value>

# 예시
http -f POST http://localhost:5000/logins username=passwd

form data 접근

 

 

URI 파라미터 접근

URI로 전달된 파라미터(?key=value)에 접근할 때는 args 속성을 사용한다.

@app.route('/users')
def get_users():
    user = request.args.get("username", "")
    return user, 200

URI 파라미터 접근

 

요청 body 접근

JSON 형식으로 전달된 요청 본문은 get_json() 함수로 접근할 수 있다.

@app.route('/message', methods=['POST'])
def echo_message():
    payload = request.get_json()
    return payload['message'], 200

요청 body 접근

 

또는 get_data() 함수로 bytes 형 객체 데이터로 얻을 수 있다. bytes 데이터드 추가적인 데이터 파싱 과정이 필요해 보인다.

@app.route('/message', methods=['POST'])
def echo_message():
    payload = request.get_data()
    payload = payload.decode('UTF-8')
    payload = json.loads(payload)

    return payload['message'], 200

 

 

요청 header 접근

요청의 Header 정보는 headers.get() 함수로 접근할 수 있다.

@app.route('/login', methods=['POST'])
def login():
    auth = request.headers.get('Authorization')
    auth = auth.split()[-1]
    auth = base64.b64decode(auth).decode('UTF-8')
    username, passwd = auth.split(':')
    
    if username == ADMIN_USERNAME and passwd == ADMIN_PASSWD:
        response = {
            'username': username,
            'message': 'ok'
        }
        return jsonify(response)

    return Response('Unauthorized', 401)

요청 header 접근

 

 

동적 URL의 변수 부분 접근

URI와 매핑되는 함수에서 매개변수로 전달받으면 된다. 이 부분은 request 모듈을 사용하지 않는다.

@app.route('/users/<username>')
def get_user_info(username):
    return jsonify({"username:": username}), 200

동적 URL의 변수 부분 접근

 

 

참고 문서

https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html#id14

https://stackoverflow.com/questions/40059654/python-convert-a-bytes-array-into-json-format

 

728x90