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
URI 파라미터 접근
URI로 전달된 파라미터(?key=value)에 접근할 때는 args 속성을 사용한다.
@app.route('/users')
def get_users():
user = request.args.get("username", "")
return user, 200
요청 body 접근
JSON 형식으로 전달된 요청 본문은 get_json() 함수로 접근할 수 있다.
@app.route('/message', methods=['POST'])
def echo_message():
payload = request.get_json()
return payload['message'], 200
또는 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)
동적 URL의 변수 부분 접근
URI와 매핑되는 함수에서 매개변수로 전달받으면 된다. 이 부분은 request 모듈을 사용하지 않는다.
@app.route('/users/<username>')
def get_user_info(username):
return jsonify({"username:": username}), 200
참고 문서
https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html#id14
https://stackoverflow.com/questions/40059654/python-convert-a-bytes-array-into-json-format