Flask 요청(Request)과 응답(Response) 기본
Flask에서 웹 서버는 기본적으로 요청(Request)을 받고 응답(Response)을 반환하는 구조로 동작한다.
사용자가 브라우저에서 URL에 접속하거나, 클라이언트가 API 호출을 하면 서버에 요청이 들어오고 Flask가 이를 처리한 뒤 응답을 돌려준다.
요청에서 자주 다루는 요소는 다음과 같다.
요청 방식(Method)
라우팅에 methods를 지정해서 어떤 요청을 받을지 설정한다.
@app.route("/test", methods=["GET", "POST"])
def test():
return "ok"
GET은 조회에, POST는 데이터 전송/생성에 주로 사용한다.
Query String 받기 (URL 파라미터)
URL 뒤에 ?key=value 형태로 붙는 값이다.
from flask import request
@app.route("/search", methods=["GET"])
def search():
q = request.args.get("q")
return f"query={q}"
예시 URL
/search?q=flask
Path Variable 받기 (경로 변수)
URL 경로 자체에 변수를 포함한다.
@app.route("/users/<name>", methods=["GET"])
def users(name):
return f"user={name}"
예시 URL
/users/minho
Body 데이터 받기 (POST)
Form 데이터와 JSON 데이터는 받는 방식이 다르다.
Form 데이터 받기 (HTML form)
from flask import request
@app.route("/login", methods=["POST"])
def login():
username = request.form.get("username")
return f"username={username}"
JSON 데이터 받기 (API)
from flask import request, jsonify
@app.route("/echo", methods=["POST"])
def echo():
data = request.json
return jsonify(data)
Header 확인하기
요청 헤더는 인증 토큰이나 Content-Type 확인에 자주 사용한다.
from flask import request
@app.route("/headers", methods=["GET"])
def headers():
ua = request.headers.get("User-Agent")
return f"User-Agent={ua}"
응답: 상태 코드와 함께 반환하기
Flask에서는 응답 데이터와 상태 코드를 함께 반환할 수 있다.
from flask import jsonify
@app.route("/notfound", methods=["GET"])
def notfound():
return jsonify({"message": "not found"}), 404
요청과 응답을 한 번에 연습할 수 있는 예제
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/api/users/<name>", methods=["GET"])
def get_user(name):
age = request.args.get("age", type=int)
return jsonify({"name": name, "age": age})
@app.route("/api/users", methods=["POST"])
def create_user():
data = request.json
if not data or "name" not in data:
return jsonify({"message": "name is required"}), 400
return jsonify({"message": "created", "user": data}), 201
if __name__ == "__main__":
app.run(debug=True)
GET 테스트
curl "http://127.0.0.1:5000/api/users/minho?age=24"
POST 테스트
curl -X POST "http://127.0.0.1:5000/api/users" \
-H "Content-Type: application/json" \
-d '{"name":"minho","age":24}'