Python Flask 로 간단한 REST API 작성하기
Flask와 MySQL 연결해서 1시간 만에 끝내기
다음의 환경에서 작업합니다.
- python3
- pip3
- PyCharm Editor
- Insomnia
- MySQL 설치
- MySQL WorkBench
프로젝트를 생성합니다.
> virtualenv flaskrest
> cd flaskrest
> source bin/activate
REST API 생성을 도와주는 모듈을 설치합니다. Endpoint URL을 클래스와 매핑시키는 것을 도와줍니다.
(flaskrest) > pip3 install flask-restful
만들어 볼 기능은 사용자 생성입니다.
‘/user’ post 요청으로 사용자를 생성하고 응답하는 api 를 작성합니다.
> vi api.py
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class CreateUser(Resource):
def post(self):
return {'status': 'success'}
api.add_resource(CreateUser, '/user')
if __name__ == '__main__':
app.run(debug=True)
서버를 실행합니다.
(flaskrest) > python api.py
REST API 테스트툴(Insomnia) 127.0.0.1:5000/user 요청을 수행하고 결과를 확인합니다.
이제 email, user_name, password 파라미터를 추가하고 파서를 사용해 파라미터를 추출합니다.
(flaskrest) > vi api.py
from flask import Flask
from flask_restful import Resource, Api
from flask_restful import reqparse
app = Flask(__name__)
api = Api(app)
class CreateUser(Resource):
def post(self):
try:
parser = reqparse.RequestParser()
parser.add_argument('email', type=str)
parser.add_argument('user_name', type=str)
parser.add_argument('password', type=str)
args = parser.parse_args()
_userEmail = args['email']
_userName = args['user_name']
_userPassword = args['password'] return {'Email': args['email'], 'UserName': args['user_name'], 'Password': args['password']}
except Exception as e:
return {'error': str(e)}
api.add_resource(CreateUser, '/user')
if __name__ == '__main__':
app.run(debug=True)
Insomnia로 ‘127.0.0.1:5000/user’ 에 post 요청을 수행하고 응답 결과를 확인합니다.
이제 입력받은 값을 MySQL DB에 저장하려고 합니다. 다음과 같이 개발 PC에 설치하거나 MySQL 무료 호스팅 서비스를 받아 생성합니다.
> yum install mysql-server
마침, 외부에서 접속이 가능한 MySQL 무료 호스팅이 있어서 그곳에 DB와 DB User, user 정보를 저장할 테이블을 생성했습니다.
가입하면 이메일 인증 메일이 스팸으로 분류됩니다. 메일이 안오면 스팸메일함을 확인합니다.
호스팅 서비스에서 제공하는 아래의 도구를 활용하여 DB를 생성하고 개발 PC에서는 MySQL Workbench 로 접속합니다.
user 테이블을 생성합니다.
> vi user.sql
CREATE TABLE user (
user_id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(80) NULL,
username VARCHAR(45) NULL,
password VARCHAR(45) NULL,
PRIMARY KEY (user_id));
user 생성을 처리하는 Stored Procedure 를 실행합니다.
> vi sp_create_user.sql
CREATE PROCEDURE `sp_create_user`(
IN p_email varchar(80),
IN p_username varchar(45),
IN p_password varchar(45)
)
BEGINIF ( select exists (select 1 from user where user_name = p_username) ) THEN
select 'Username Exists !!';
ELSEinsert into user (
email,
user_name,
password
) values (
p_email,
p_username,
p_password
);END IF;END
Flask 에서 MySQL을 사용하기 위해서 Flask MySQL Connector 모듈을 설치합니다.
(flaskrest) > pip3 install flask-mysql
MySQL 연결 설정을 하고 sp_create_user 를 호출합니다.
vi api.py
...
from flaskext.mysql import MySQL
...# MySQL 연결
mysql = MySQL()
app.config['MYSQL_DATABASE_USER'] = '<dbuser>'
app.config['MYSQL_DATABASE_PASSWORD'] = '<dbuser_password>'
app.config['MYSQL_DATABASE_DB'] = '<mysql_db_name>'
app.config['MYSQL_DATABASE_HOST'] = '<mysql_host_name>'
mysql.init_app(app)
class CreateUser(Resource):
def post(self):
try:
...
_userEmail = args['email']
_userName = args['user_name']
_userPassword = args['password']
conn = mysql.connect()
cursor = conn.cursor()
cursor.callproc('sp_create_user', (_userEmail, _userName, _userPassword))
data = cursor.fetchall()
if len(data) is 0:
conn.commit()
return {'StatusCode': '200', 'Message': 'User creation success'}
else:
return {'StatusCode': '1000', 'Message': str(data[0])}
...
Insomnia 로 테스트해봅니다.
이제 산책하러 가야겠습니다.
참고