[Flask] flask를 이용한 API작성 -RESTful api, Blueprint

EnaZero·2024년 11월 1일
0

flask

: web frame work

web framework란?

웹 프레임 워크는 웹 페이지, 웹 애플리케이션 등의 서비스 개발 보조용으로 만들어지는 프레임워크입니다. 웹 페이지의 더 편리한 개발을 위해 사용하며,데이터베이스와 UI를 연동하고 관리하는 데에 용이합니다.

  • 플라스크는 python을 사용합니다.
  • blueprint를 이용한 개발 지원
  • django 보다 유연성이 더 크고 쉽게 배워서 개발할 수 있습니다. 하지만 규모가 매우 큰 서비스의 경우엔 추천하지 않습니다.

RESTful api

RESTful api란?

RESTful한 API는 자원(Resource) 중심으로 설계되며, HTTP 프로토콜의 메소드(GET, POST, PUT, DELETE 등)을 사용하여 해당 자원에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
이를 이용하면 두 컴퓨터 시스템이 안전하게 정보를 교환할 수 있다는 장점이 있습니다.

이 때 자원은 URL을 통해 식별되며, JSON 또는 XML의 형태로 클라이언트에게 전달됩니다.

  • Get : 자원 읽기 (URL내의 자원 불러오기)
  • Post : 자원 생성 (서버에 데이터 전송)
  • Put : 자원 업데이트
  • Delete : 자원 삭제

더 자세하게 알아보기 좋은 자료로 AWS 공식문서를 첨부하겠습니다.
RESTful api - AWS 공식문서

restful api 설치

pip install flask
pip install flask-restful

venv 가상환경이 실행된 상태에서 설치했습니다.
venv 가상환경 실행하는 법은 source venv/bin/activate
비활성화는 deactivate로 진행됩니다.

# restful import
from flask_restful import Resource, Api

상태 코드 - 요청에 대한 성공/ 실패 응답

  • 200: 일반 성공 응답
  • 201: POST 메서드 성공 응답
  • 400: 서버가 처리할 수 없는 잘못된 요청
  • 404: 리소스를 찾을 수 없음

예시코드 - users.py post method

  def post(self):
 
        data = request.json
        print("Received data:", data)  # 디버깅: 수신된 데이터 출력 

        student_id = data.get('student_id')
        role = data.get('role')
        email = data.get('email')
        name = data.get('name')
        photo_url = data.get('photo_url')
        professor = data.get('professor')
    
        print("Student ID:", student_id)  # 디버깅: 필드 값 확인
        if not all([student_id, role, email, name]): # 네 개 다 값 존재하면 True, 하나라도 없으면 False
            return {"error": "Missing required fields"}, 400  # dict로 반환

        try:
            conn = get_db_connection()
            cursor = conn.cursor()
            cursor.execute(
                'INSERT INTO user (student_id, role, email, name, photo_url, professor) VALUES (%s, %s, %s, %s, %s, %s)',
                (student_id, role, email, name, photo_url, professor)
            )
            conn.commit()
            return {"message": "User added successfully"}, 201  # dict로 반환

        except pymysql.MySQLError as e:
            print(f"Database error: {e}")
            conn.rollback()
            return {"error": "Failed to insert data"}, 500  # dict로 반환

        finally:
            cursor.close()
            conn.close()

GET, POST 요청은 JSON or XML형태로 전달되고 반환됩니다.

POST 요청 예시
curl -X POST http://IP:portnum/users -H 
"Content-Type: application/json" -d 
'{ "student_id" : "12345",
	"role" : "student",
    "email" : "test@test.com",
    "name" : "Test", 
    "professor" : "Prof"}'

RESTful api 작성 규칙 참조

blueprint

블루프린트란?

블루프린트의 기본 개념은 어플리케이션에 블루프린트가 등록될 때 실행할 동작을 기록한다는 것입니다. 플라스크는 요청을 보내고 URL을 생성 할 때 뷰 함수와 블루프린트가 연동됩니다.
블루프린트를 활용하면 각 리소스를 모듈별로 분리하여 API 구조를 더 체계적으로 관리할 수 있습니다. 이에 대해 대형 어플리케이션이 동작하는 방식을 단순화할 수 있다는 장점이 있습니다.

간단하게 제 프로젝트 코드로 사용 예제를 적어보도록 하겠습니다.

app.py

# app.py

from flask import Blueprint, jsonify, request #Blueprint import
from flask_restful import Resource, Api # Restful API적용
from database import get_db_connection # DB 연결하는 함수
import pymysql

app = Flask(__name__)
CORS(app)
api = Api(app)

# User class blueprint 등록. User관련 method는 url이 /users로 시작
app.register_blueprint(users_bp, url_prefix='/users') 

# Flask 서버 실행
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

users.py

from flask import Blueprint, jsonify, request
from flask_restful import Resource, Api
from database import get_db_connection
import pymysql

# Blueprint 생성
users_bp = Blueprint('users', __name__)
api = Api(users_bp)  # Blueprint에 Api 객체 연결

Class Users(Resource):
	def get(self, user_id=None):
    # 이하 코드 생략 
    
# Users 클래스를 Blueprint에 등록
api.add_resource(Users, '', '/<int:user_id>')

이처럼 클래스 내에서 get, post등의 method는 그대로 적고 blueprint를 생성 및 등록한 뒤 이를 api실행코드의 메인이 되는 app.py에서 blueprint를 등록해 prefix를 지정해주기만 하면 됩니다.
app.py에서 블루프린트를 등록할 때는 users.py에서 생성해둔 블루프린트 변수를 받아와서 사용하면 app.py의 코드를 더 깔끔하게 만들 수 있습니다.

flask 공식 문서 - 블루프린트를 가진 모듈화된 어플리케이션

flask를 활용한 api 작성을 위한 library
flask api 작성 도움 - restful, CRUD

0개의 댓글