사용자의 요청에 대해서 html코드를 응답하는 uri와 API로 리소스만 제공하는 uri가 있다. 이 두개를 구분해서 개발할 것이다.
flask에서 제공하는 blueprint를 이용할 것이다.
1. __init__.py
from flask import Blueprint
api = Blueprint('api', __name__)
from . import user
api라는 이름의 블루프린터를 만들고 이 api를 통해서 user.py안에서 api코드를 만들 것이다.
2. user.py
# 사용자 API
from flask import jsonify
from . import api # . 은 현재위치를 말한다
from flask import requuest
from models import Fcuser
from models import db
@api.route('/users', methods=['GET', 'POST'])
def users():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
# 데이터 유효성 검사
if not(userid and username and password and re_password):
return jsonify({'error' : 'No argument'}), 400
if password != re_password:
return jsonify({'error' : 'Wrong Password'}), 400
# 데이터베이스 저장
fcuser.Fcuser() # 모델 객체 생성
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return jsonify(), 201
users = Fcuser.query.all() # 모든 사용자 가져오기
return jsonify([user.serialize for user in users])
@api.route()는 @app.route()와 같다. 여기서는 api를 사용하므로 @api.route()를 쓴 것이다.
api에서는 html이 아닌 데이터를 반환하고 그 데이터는 json형태이다. return jsonify()뒤에 ,로 상태를 함께 보낼 수 있다. jsonify(), 404를 하면 에러코드를 함께 보낸다.
즉, api_v1폴더에 __init__에서 api라는 blueprint를 만들었고, 그 api를 이용해서 user.py에서 컨트롤러 코드를 만든 것이다.
블루프린트
작성한 컨트롤러 코드들이 app.py에 모여잇지 않고 분리해서 작성할 수 잇다. 그 코드들은 api_v1에 있고, 거기서 개발한 컨트롤러 코드들은 user.py에 있다. 그럼 user.py에서 쓰는 api는 어디서 가져온거냐면 __init__.py에서 블루프린트로 api객체를 만들었고 그것을 이용한 것이다.
api는 jsonify()함수를 통해서 json 리소스만 전달해준다.
3. 데이터 직렬화
jsonify()로 데이터를 전달할 때 그냥 jsonify(users)를 하면 직렬화(json형태)가 안되어있기 때문에 에러가 발생한다.
따라서 직렬화해주어야 한다.
models.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# 회원 모델 생성
class Fcuser(db.Model):
__tablename__ = 'fcuser'
id = db.Column(db.Integer, primary_key=True) # primary_key : 고유값으로 지정한다.
password = db.Column(db.String(64))
userid = db.Column(db.String(32))
username = db.Column(db.String(8))
@property # 데코레이터 형으로 하면 함수지만 접근할 때 변수처럼 사용할 수 있따.
def serialize(self): # 이것이 직렬화하여 json형태로 한것이다.
return {
'id' : self.id,
'password' : self.password,
'userid' : self.userid,
'username' : self.username
}
그런 후에 위에 user.py코드에서 처럼 지능형 리스트로 jsonify()에 argument로 넘겨주면 된다.
'PNU DSC > Solution Challenge' 카테고리의 다른 글
Flask 18. jQuery와 ajax (0) | 2020.03.24 |
---|---|
Flask 17. CRUD (0) | 2020.03.23 |
Flask 15. HTTP와 RESTful API (0) | 2020.03.11 |
Flask 14. 백엔드와 프론트엔드 (0) | 2020.03.11 |
Flask 12. 로그아웃 (0) | 2020.03.11 |