API๋ค์ ๋ถ๋ฅํ๊ณ ๊ด๋ฆฌํ๋ค.
Flask์ ๊ธฐ๋ฅ์ด ์ ์ ๋์ด๋ ์๋ก, ์์ฐ์ค๋ฝ๊ฒ ์ฝ๋์ ์์ด ์ฆ๊ฐํ๋ค.
์ด๋, Blueprint๋ฅผ ์ฌ์ฉํด์ ๊ธธ์ด์ง ์ฝ๋๋ฅผ ๋ชจ๋ํํด์ฃผ์ด ์์ ๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์์ ์ฉ์ดํ๊ฒ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/', methods=['GET'])
def home_route():
return jsonify('home')
@app.route('/first', methods=['GET'])
def first_route():
return jsonify('first page')
...
if __name__ == '__main__':
app.run(debug=True)
app.py
from flask import Flask
from first_api import bp
app = Flask(__name__)
app.register_blueprint(bp)
if __name__ == '__main__':
app.run(debug==True)
from flask import Blueprint, jsonify
bp = Blueprint('bp', __name__)
@bp.route('/first', methods=['GET'])
def first_route():
return jsonify('first page')
@bp.route('/second', methods=['GET'])
def second_route():
return jsonify('second page')
Jinja2๋ Python์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํ ํ๋ฆฟ์ด๋ค. ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ ๋น๊ต์ ๊ฐ๋ตํ ํํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ ์ ์๋ค.
app.py
@app.route('/')
def alex():
return render_template('index.html', data='alex')
<html>
<head>
<title> jinja example</title>
<body>
{{ data }}
</body>
</head>
</html>
app.py
@app.route('/')
def alex():
my_list = [1,2,3,4,5]
return render_template('index.html', data=my_list)
index.html
<html>
<head>
<title>jinja example</title>
</head>
<body>
{{ data }}
{% for d in data %}
{{ d }}
{% endfor %}
</body>
</html>
app.py
@app.route('/')
def alex():
my_data = {'name':'alex'}
return render_template('index.html', data=my_data)
index.html
<html>
<head>
<title>jinja example</title>
</head>
<body>
{{ data.get('name') }}
</body>
</html>
ํด๋ผ์ด์ธํธ๋ HTTP request๋ฅผ API ์ฃผ์๋ก ๋ณด๋ด๋ ๋ฐ, API ์๋ฒ์ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ค ์๋ต์ ๋ค๋ ค์ค ์ง ํ์ ํ๊ณ , ์๋ฒ๋ page๋ JSON์ ํํ๋ก ์๋ต์ ๋๋ ค์ค๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ ๋ชจ๋ ์์ ์ ๊ฐ์ธ์ ์ปดํจํฐ(๋ธ๋ผ์ฐ์ )์์ ์ด๋ฃจ์ด์ง๋ค. ์์ฒญ์ด ์๋ฒ๋ก ์ ๋ฌ ๋ ๋์๋ HTTP request ํํ๋ก ๋์ด๊ฐ๋ค. ์ค๊ฐ์ API ์ฃผ์๋ค์ ์๋ฒ์ ๋งคํ๋์ด ์๋ค.[@app.route()] ์ฆ, ์๋ฒ ์์์ API์ ์ฃผ์๋ฅผ ํ์ธํ๊ณ , ํด๋น ๊ธฐ๋ฅ์ ์ํํ๊ณ ๋ฆฌํด ๊ฐ์ ๋๋ ค์ฃผ๋ ๊ฒ์ด ์๋ต์ ๊ณผ์ ์ด๋ค.
- Create : ๋ฐ์ดํฐ์ ์์ฑ
- Read : ๋ฐ์ดํฐ์ ์กฐํ
- Update : ๋ฐ์ดํฐ์ ์์
- Delete : ๋ฐ์ดํฐ์ ์ญ์
๋ฅผ ๋ปํ๋ค. ์ฌ๊ธฐ์ ๋ ๋ถ๋ฅ๋ฅผ ํ์๋ฉด, CREATE์ READ๋ฅผ ๋ฌถ๊ณ , Update์ Delete๋ฅผ ํจ๊ป ๋ฌถ์ ์ ์๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ ๊ฒ์ด๋ค.
Create๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ฐ์ฐ์ด๋ค.
Read๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ์ฐ์ฐ์ด๋ค. (์ ์ฒด ํน์ ํ๋๋ฅผ ์ฝ์ ์ ์๋ค.)
Update์ Delete๋ ๋ณธ์ง์ ์ผ๋ก ์ ์ฅํ๋ ์ฐ์ฐ์ด๋, ์ฝ๊ธฐ ์์
์ ํฐ ๋น์ค์ ๊ฐ์ง ์ ์ฅ์ด๋ค. (๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ฝ์ด์ค๊ณ , ์ฝ์ด์จ ๋ฐ์ดํฐ์ ์์ /์ญ์ ์ฐ์ฐ์ ํ๋ค.)
CRUD | HTTP Method | DB ๋ช ๋ น์ด |
---|---|---|
Create | POST | INSERT |
Read | GET | SELECT |
Update | PUT, PATCH, (POST) | UPDATE |
Delete | DELETE | DELETE |
์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ๋ ์ ์ฐจ์ด๋ฉฐ, ๋ํ์ ์ธ ์๋ก ํ์๊ฐ์
ํ๊ณ ๋ก๊ทธ์ธ ํ๋ ๊ณผ์ ์ด ์๋ค.
1. ํ์๊ฐ์
-> ๋ด ์ ๋ณด๋ฅผ ์๋ฒ๋ก ์ ์กํ๋ค. create๋ก ๊ณ์ ์ ๋ง๋ค ๋, ํจ์ค์๋์ ๊ฒฝ์ฐ ์ํธํ๋ฅผ ๊ฑฐ์ณ ์ ์ฅ๋๋ค.
2. ๋ก๊ทธ์ธ -> IP/PW๋ฅผ ์
๋ ฅํ์ฌ ์๋ฒ์ ์ ์กํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์ฝ์ด, ์ ์กํ ์ ๋ณด๋ ๊ฐ์ ๊ฒ์ด ์๋์ง ํ์ธํ๋ค. ์ผ์นํ๋ฉด ๋ก๊ทธ์ธ์ด ์ด๋ฃจ์ด์ง๋ค. (session, JWT[token])
3. ๋ก๊ทธ์์ -> ์ธ์
์ ์ฐ๊ฒฐ์ ๋๋๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ํต์ ์์ (์์ฒญ/์๋ต == HTTP ํต์ ์ ํ ์ฌ์ดํด) ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ ์ ์ฌ๋ถ๋ฅผ ์ ์ ์๋ค. HTTP๋ ์ํ ๊ฐ์ ์ ์ฅํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฌํ ๊ฒ์ ์ ์ฅํ๊ธฐ ์ํด ์ฟ ํค๋ก ์ ์ฅํ์ฌ ์ ์กํ๋ ๊ฒ์ด๊ณ , ์ธ์ ์ผ๋ก ์๋ณํ์ฌ ์๋ฒ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๋ ํค/๊ฐ์ด ๋ค์ด ์๋ ๋ฐ์ดํฐ์ด๋ค.
์ฟ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง ์๋ฒ ์ธก์์ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ์ด๋ค.
ํด๋ผ์ด์ธํธ์ ๊ณ ์ ID๋ฅผ ๋ถ์ฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ง๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. ์๋ฒ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ณด์์ด ์ฟ ํค๋ณด๋ค ์ฐ์ํ๋ค.
๊ณตํต์ : ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค.
์ฐจ์ด์ : ์ธ์
์ ์๋ฒ์์ ๊ด๋ฆฌํ๋ฉฐ, ์ฟ ํค๋ ํด๋ผ์ด์ธํธ์์ ๊ด๋ฆฌํ๋ค.
๋ก๊ทธ์ธ์ ๊ฒฝ์ฐ ์ธ์ ์์ ์ฌ์ฉ. ์๋ฒ์์ ๊ด๋ฆฌ.
user_id = request.form['user_id']
user_pw = request.form['user_pw']
user = {'user_id': 'elice', 'user_pw': '1234'}
if user is not None:
if user_id == user['user_id'] and user_pw == user['user_pw']:
session['login'] = user.id
return jsonify({'result':'success'})
else:
return jsonify({'result':'fail'})
session['login'] = None
ํ๋ก๊ทธ๋จ์ด ์๋ํ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ๋ ํ์์ด๋ค.
์ด๋ฒคํธ: ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ, ๋์
ํ๋ก๊ทธ๋จ์ ๋ฌธ์ ๋ค์ ํ์ ํ๊ณ ์ ์ง๋ณด์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋ก๊น ์ ํตํด ๋ฐ์ํ ์๋ฌ๋ฅผ ์ถ์ ํ ์ ์๋ค.
DEBUG < INFO < WARNING < ERROR < CRITICAL : ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ์๋ก ์ฌ๊ฐ๋๊ฐ ๋๋ค.
๊ธฐ๋ณธ ๋ก๊ฑฐ ๋ ๋ฒจ ์ธํ
์ WARNING์ด๊ธฐ ๋์ ์ค์ ์์ด INFO, DEBUG๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
(๋์ ์์ผ๋ก ์ค์ ๋์์ ์๋ก ํ์ ๋ ๋ฒจ์ ๋ฌด์ํ๋ค.)
import logging
if __name__ == '__main__':
logger.info('hello elice!')
ํ์ด์ฌ ๋ํดํธ ๋ก๊น ๋ชจ๋์ ์ฌ์ฉํ๋ค.
import logging
if __name__ == '__main__':
logger = logging.getLogger()
logger.setlevel(logging.DEBUG)
logger.info('hello elice!')
#๋ ๋ฒจ์ ์๋์ผ๋ก ์ค์ ํ๊ณ ์ถ๋ ฅํ๋ฉด ์ ์์ ์ผ๋ก ์ถ๋ ฅ์ด ๋๋ค.
์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ Flask์ logger๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ค.
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.logger.info('test')
app.logger.debug('debug test')
app.logger.error('error test')
app.run()