๐Ÿ“•Week4 day1(Flask)

๋ฐ•์ค€ํฌยท2023๋…„ 9์›” 11์ผ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋ชฉ๋ก ๋ณด๊ธฐ
18/28
post-thumbnail

Flask


flask๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํŒŒ์ด์ฌ ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒํ™˜๊ฒฝ์„ ์„ค์ •ํ•œ๋‹ค.

๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ •

  • CLIํ™˜๊ฒฝ์—์„œ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์›€์ง์ธ๋‹ค.
    Programmers/flask-proj ๋‚˜๋Š” ์ด๊ฒฝ๋กœ์— ์„ค์ •ํ–ˆ๋‹ค.

  • ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ชจ๋“ˆ ์„ค์น˜
    pip install virtualenv

  • venv๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ
    virtualenv venv

  • ๊ฐ€์ƒํ™˜๊ฒฝ ํ™œ์„ฑํ™”
    source venv\Scripts\activate
    ๊ฐ€์ƒํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™” ํ•œ ํ›„ pip install๋ช…๋ น์„ ํ†ตํ•ด ์„ค์น˜๋œ ๋ชจ๋“ˆ์„ ํ™•์ธํ•ด๋ณด๋ฉด ์•„๋ฌด๋Ÿฐ ๊ฒƒ๋„ ๋œจ์ง€ ์•Š๋Š”๋‹ค.

  • flask ์„ค์น˜
    pip install flask
    ์ด ํ›„ ๋‹ค์‹œ pip freeze๋ฅผ ์‹คํ–‰ํ•˜๋ฉด flask๊ฐ€ ๋‚˜์˜จ๋‹ค.

Flask ์„œ๋ฒ„ ๊ตฌ๋™

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
	return 'Hello World!'

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

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ app.pyํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค.
๊ทธ ํ›„ CLIํ™˜๊ฒฝ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ flask run๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด flask์„œ๋ฒ„๊ฐ€ ๊ตฌ๋™ํ•œ๋‹ค.
์ถœ๋ ฅ๋œ URL์— ์ ‘์†ํ•ด๋ณด๋ฉด Hello World! ๊ฐ€ ์ถœ๋ ฅ๋œ ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Flask Rest API

๐Ÿ“’api๋ž€?

ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด

๐Ÿ“’rest๋ž€?

representational state transfer
์›น์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์ž์›(resource)

๐Ÿ“’rest api๋ž€?

HTTP URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ 
HTTP Method๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD๋ฅผ ์ง„ํ–‰

CRUD ๊ตฌํ˜„

์œ„์˜ app.pyํŒŒ์ผ์— CRUD๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

from flask import Flask, jsonify, request

app = Flask(__name__)

menus = [
    {"id":1, "name": "Espresso","price":3800},
    {"id":2, "name": "Americano","price":4100},
    {"id":3, "name": "CafeLatte","price":4600},
]

@app.route('/')
def hello_flask():
    return "Hello World"

#GET /menus | ์ž๋ฃŒ๋ฅผ ๊ฐ€์ง€๊ณ ์˜จ๋‹ค
@app.route('/menus')
def get_menus():
    return jsonify({"menus":menus})#jsonํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด menus๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ณ€ํ˜•
# menus๋Š” ๋ฆฌ์ŠคํŠธ๋กœ json์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค. 
#๋”ฐ๋ผ์„œ menus๋ฅผ value๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.
new_id = 4

# POST /menus : ์ž๋ฃŒ๋ฅผ ์ž์›์— ์ถ”๊ฐ€ํ•œ๋‹ค.
# @app.route๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ methods=['GET']๋ผ๊ณ  ๋˜์–ด์žˆ๋‹ค.
# ๋‚˜๋จธ์ง€ HTTP ๋™์ž‘๋“ค, POST ๋“ฑ์€ ์ง์ ‘ ๋ช…์‹œ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

@app.route('/menus', methods = ['POST'])#
def create_menu(): # reuqest๊ฐ€ JSON์ด๋ผ๊ณ  ๊ฐ€์ •
    global new_id
    #์ „๋‹ฌ๋ฐ›์€ ์ž๋ฃŒ๋ฅผ menus์ž์›์— ์ถ”๊ฐ€
    request_data = request.get_json() #{"name":...,"price":...}
    new_menu = {
        "id":new_id,
        "name": request_data['name'],
        "price": request_data['price'],
    }
    new_id+=1
    menus.append(new_menu)
    return jsonify(new_menu)

# PUT /menu/<int:id> : ํ•ด๋‹นํ•˜๋Š” id์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. (HTTPRequest์˜ Body์— ๊ฐฑ์‹ ํ•  ๋‚ด์šฉ์ด json์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.)
@app.route('/menus/<int:id>', methods=['PUT'])
def put_menu(id):
    update_data = request.get_json()
    try:
        menus[id-1]['name'] = update_data['name']
        menus[id-1]['price'] = update_data['price']
        return jsonify(menus[id-1])
    except Exception as e:
        print(e)
        return 'There was a problem!'

# DELETE /menu/<int:id> : ํ•ด๋‹นํ•˜๋Š” id์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
@app.route('/menus/<int:id>', methods=['DELETE'])
def delete_menu(id):
    try:
        del menus[id-1]
        return jsonify(menus)
    except Exception as e:
        print(e)
        return 'There was a problem!'

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

*์ฝ”๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ฃผ์„์œผ๋กœ ๋‹ค ๋‹ฌ์•„๋†“์•˜๋‹ค.
๋~!


profile
๊ฒŒ์„๋ €๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€

0๊ฐœ์˜ ๋Œ“๊ธ€