본문 바로가기
Archive/TIL

[DevCourse] 0514 TIL

by 다람이도토리 2021. 5. 14.

0. 역시, 아직도 Flask라던가 Django 등 웹 쪽은 많이많이 약하다. 욕심 부리지말고, 기본 과제밖에 하지 못해도 정확하게 이해하고 넘어가는 것을 목표로 하자. 심화 과제는 나중에 실력 붙고 도전해도 늦지 않다.

1. 오늘 Flask 기본 과제는 재고 관리 관련이었다. 살짝 욕심을 내서,

id / 상품명 / 재고

로 해도 충분하겠지만, 상품명 / 재고로 잡고, 상품명을 primary key로 하여 상품명이 겹칠 경우 Error 메세지를 직접 만들어 띄우는 방법쪽으로 가고 싶었으나, 잘 되지 않았다.

시도는 그냥 data를 받아와서 그 안에 name을 가져오는 방식을 원했는데, 애초에 데이터를 받아오면서 Error가 발생하는 시점이라, if문을 돌려서 조건읆 검색하는 시점보다 빨라버려 해당 방법은 불가능하였다.

Primary key의 충돌로 발생한 에러는 IntegrityError 이다. 이를 try~ except 구문을 활용하여 발생시키면 됐다.

다만, flask 환경에서 내가 SQLalchemy을 사용하고 있어 그냥 except 하면 안되고, module을 불러와야 했다.

해당 부분을 반영한 풀 코드는 다음과 같다.

# Mission1_core (Flask 이용)
# bicsubi_core_20210514
from flask import Flask, jsonify, request
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import exc

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class Weapons(db.Model):
    name = db.Column(db.String(60), primary_key = True)
    stock = db.Column(db.Integer, nullable = False)

# 첫 시작에 db 생성을 위해 반드시 필요
db.create_all()

# Home Directory
@app.route('/')
def hello_bicsubi():
    return "I'm not a Sirii, I'm just bicsubi. This is Mission 1."

# Get | whoami
@app.route('/whoami')
def who_am_i():
    return jsonify({'name': 'SeongwonTak' })

# Get | whoami
@app.route('/echo')
def return_string():
    string = request.args.get('string')
    return jsonify({"string":string})

# Get | 자료를 가지고 옴 (READ)
@app.route('/weapons')
def get_weapons():
    return jsonify([
       {'name':weapon.name,
        'stock':weapon.stock
        } for weapon in Weapons.query.all()])

# POST | 자원 추가 (CREATE)
@app.route('/weapons', methods=['POST'])
def post_weapons(): # request가 JSON이라고 가정한다.
    try:
        request_data = request.get_json()
        new_weapon = Weapons(name=request_data['name'],
                        stock=request_data['stock'])

        if new_weapon.stock <= 0 or type(new_weapon.stock) is not int:
            return 'Error Code 02 : Stock value must be positive integer'
        else:
            db.session.add(new_weapon)
            db.session.commit()

        return jsonify([
            {'name': weapon.name,
         '  stock': weapon.stock
            } for weapon in Weapons.query.all()])
    except exc.IntegrityError :
        return 'Error Code 01 : duplicated name exists in Weapons'


@app.route('/weapons/<string:name>', methods=['PUT'])
def put_weapons(name):
    try:
        alter_weapon = Weapons.query.get_or_404(name)
        update_data = request.get_json()

        alter_weapon.name = update_data['name']
        alter_weapon.stock = update_data['stock']

        if alter_weapon.stock <= 0 or type(alter_weapon.stock) is not int:
            return 'Error Code 02 : Stock value must be positive integer'
        else:
            db.session.commit()

        return jsonify([
            {'name': alter_weapon.name,
            'stock': alter_weapon.stock
            }])
    except exc.IntegrityError :
        return 'Error Code 01 : duplicated name exists in Weapons'

@app.route('/weapons/<string:name>', methods=['DELETE'])
def delete_weapons(name):
    del_weapon = Weapons.query.get_or_404(name)
    db.session.delete(del_weapon)
    db.session.commit()

    return jsonify([
        {'name': weapon.name,
         'stock': weapon.stock
         } for weapon in Weapons.query.all()])


if __name__ == '__main__':
    app.run()

 

'Archive > TIL' 카테고리의 다른 글

[0602] 면접 오답노트  (0) 2021.06.02
[TIL] 0528 TIL  (0) 2021.05.28
[DevCourse] 인공지능 모델의 배포  (0) 2021.05.09
[DevCourse] 0507 시계열 데이터 다루기  (0) 2021.05.07
[DevCourse] 0506 TIL  (0) 2021.05.06