오도원입니다.

건강과 행복을 위하여

PNU DSC/Solution Challenge

Flask 16. 회원생성 API 만들기

오도원공육사 2020. 3. 16. 16:53
반응형

사용자의 요청에 대해서 html코드를 응답하는 uri와 API로 리소스만 제공하는 uri가 있다. 이 두개를 구분해서 개발할 것이다.

 

flask에서 제공하는 blueprint를 이용할 것이다.

 

api저장 폴더

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