: web frame work
web framework란?
웹 프레임 워크는 웹 페이지, 웹 애플리케이션 등의 서비스 개발 보조용으로 만들어지는 프레임워크입니다. 웹 페이지의 더 편리한 개발을 위해 사용하며,데이터베이스와 UI를 연동하고 관리하는 데에 용이합니다.
RESTful api란?
RESTful한 API는 자원(Resource) 중심으로 설계되며, HTTP 프로토콜의 메소드(GET, POST, PUT, DELETE 등)을 사용하여 해당 자원에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
이를 이용하면 두 컴퓨터 시스템이 안전하게 정보를 교환할 수 있다는 장점이 있습니다.
이 때 자원은 URL을 통해 식별되며, JSON 또는 XML의 형태로 클라이언트에게 전달됩니다.
더 자세하게 알아보기 좋은 자료로 AWS 공식문서를 첨부하겠습니다.
RESTful api - AWS 공식문서
pip install flask
pip install flask-restful
venv 가상환경이 실행된 상태에서 설치했습니다.
venv 가상환경 실행하는 법은 source venv/bin/activate
비활성화는 deactivate
로 진행됩니다.
# restful import
from flask_restful import Resource, Api
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형태로 전달되고 반환됩니다.
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"}'
블루프린트란?
블루프린트의 기본 개념은 어플리케이션에 블루프린트가 등록될 때 실행할 동작을 기록한다는 것입니다. 플라스크는 요청을 보내고 URL을 생성 할 때 뷰 함수와 블루프린트가 연동됩니다.
블루프린트를 활용하면 각 리소스를 모듈별로 분리하여 API 구조를 더 체계적으로 관리할 수 있습니다. 이에 대해 대형 어플리케이션이 동작하는 방식을 단순화할 수 있다는 장점이 있습니다.
간단하게 제 프로젝트 코드로 사용 예제를 적어보도록 하겠습니다.
# 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)
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