๐ ์ธ์ฆ(Authentication)
์ธ์ฆ์ ์ ์ ์ identification์ ํ์ธํ๋ ์ ์ฐจ์ด๋ค. ํ ๋ง๋๋ก, ์ ์ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ๋ ์ ์ฐจ๋ค.
์ธ์ฆ์ ํ๊ธฐ ์ํด์ ๋จผ์ , ์ ์ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ๋ ํ์ํ๋ค.
์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๋ก๊ทธ์ธ ์ ์ฐจ๋ ์๊ฐํด๋ณด์.
1. ํ์๊ฐ์ : ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๋ค.
- ์ด๋, ๋น๋ฐ๋ฒํธ๋ ์ํธํ ์ ์ฅํ๋ค.
2. ๋ก๊ทธ์ธ : ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ค.
- ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ ํ ํ, DB์ ์ ์ฅ๋ ์ํธํ ๋น๋ฐ๋ฒํธ์ ๋น๊ตํ๋ค.
3. ์ผ์นํ๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต, ์ผ์นํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
4. ๋ก๊ทธ์ธ์ด ์ฑ๊ณต๋๋ฉด access_tocken์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋ค.
5. ์ ์ ๋ ๋ก๊ทธ์ธ ์ฑ๊ณ ํ ๋ค์๋ถํฐ๋ access_tocken์ ์ฒจ๋ถํด์, request๋ฅผ ์๋ฒ์ ์ ์กํ๋ค.
๐ก ๋น๋ฐ๋ฒํธ ์ํธํ
์ ์ ์ ๋น๋ฐ๋ฒํธ๋ ์ ๋ ๊ทธ๋๋ก DB์ ์ ์ฅ๋์ง ์๋๋ค. ๋ง์ผ DB๊ฐ ํดํน ๋นํ ๊ฒฝ์ฐ, ๊ทธ๋๋ก ์ ์ถ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, ์ ์ ์ ๋น๋ฐ๋ฒํธ๋ ๋ฐ๋์ ์ํธํํ์ฌ ์ ์ฅํด์ผ ํ๋ค. ๊ทธ๋ด ๊ฒฝ์ฐ DB๊ฐ ํดํน ๋นํ๋๋ผ๋ ๊ทธ๋๋ก ๋
ธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ก ํ๊ฐ(Authorization)
ํ๊ฐ๋ ์ ์ ๊ฐ ์์ฒญํ๋ request๋ฅผ ์คํํ ์ ์๋ ๊ถํ์ด ์๋ ์ ์ ์ธ๊ฐ๋ฅผ ํ์ธํ๋ ์ ์ฐจ์ด๋ค.
์๋ฅผ ๋ค์ด ํด๋น ์ ์ ๋ ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ง๋ง, ์์ ํ ๊ถํ์ ์๋ ๊ฒฝ์ฐ์ด๋ค.
๐ Flask ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ
# 1๋ฒ์ ํด๋ณด์ธ์!
from flask import Flask, request, render_template, session, url_for, redirect
app = Flask(__name__)
app.secret_key = 'super secret key'
app.config['SESSION_TYPE'] = 'filesystem'
userinfo = {'Elice': '1q2w3e4r!!'}
@app.route("/")
def home():
if session.get('logged_in'):
return render_template('loggedin.html')
else:
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
name = request.form['username']
password = request.form['password']
try:
if (name in userinfo):
#2๋ฒ์ ํด๋ณด์ธ์!
session["logged_in"] = True
#3๋ฒ์ ํด๋ณด์ธ์!
return render_template('loggedin.html')
#4๋ฒ์ ํด๋ณด์ธ์!
else:
return '๋น๋ฐ๋ฒํธ๊ฐ ํ๋ฆฝ๋๋ค.'
return '์์ด๋๊ฐ ์์ต๋๋ค.'
except:
return 'Dont login'
else:
return render_template('login.html')
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
#4๋ฒ์ ํด๋ณด์ธ์!
name = request.form['username']
password = request.form['password']
userinfo[name] = password
return redirect(url_for('login'))
else:
return render_template('register.html')
@app.route("/logout")
def logout():
session['logged_in'] = False
return render_template('index.html')
if __name__ == '__main__':
app.run()
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML for python flask</title>
</head>
<body>
<p>๋ก๊ทธ์ธ์ด ํ์ํ ์๋น์ค์
๋๋ค.</p>
<a href= "login">๋ก๊ทธ์ธ์ฐฝ์ผ๋ก</a><br>
<a href= "register">ํ์๊ฐ์
</a>
</body>
</html>
<!-- loggedin.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML for python flask</title>
</head>
<body>
<form action = "" method="post">
<p>๋ก๊ทธ์ธ ์ฑ๊ณต ํ์ด์ง</p>
<a href= "/logout">๋ก๊ทธ์์</a>
</form>
</body>
</html>
<!-- login.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML for python flask</title>
</head>
<body>
<form action = "" method="post">
<p>name : <input type="text" name = "username"></p>
<p>password : <input type="password" name = "password"></p>
<p>์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๊ณ ๋ก๊ทธ์ธ๋ฒํผ์ ๋๋ฅด์ธ์.<br><input type = "submit" value = "๋ก๊ทธ์ธ"/> </p>
</form>
</body>
</html>
<!-- register.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML for python flask</title>
</head>
<body>
<form action = "" method="post">
<p>name : <input type="text" name = "username"></p>
<p>password : <input type="password" name = "password"></p>
<p>์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๊ณ ์์ฑ๋ฒํผ์ ๋๋ฅด์ธ์.<br> <input type = "submit" value = "์์ฑ"/> </p>
</form>
</body>
</html>
๐ ๋ก๊น
๋ก๊น
์ ํ๋ก๊ทธ๋จ์ด ์๋ํ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ๋ ํ์์ด๋ค.
ํ๋ก๊ทธ๋จ์ ๋ฌธ์ ๋ค์ ํ์
ํ๊ณ ์ ์ง๋ณด์ํ๋๋ฐ ์ฌ์ฉ๋๊ณ , ๋ก๊น
์ ํตํด ๋ฐ์ํ ์๋ฌ๋ฅผ ์ถ์ ๊ฐ๋ฅํ๋ค.
์ด์ ์ค์ธ ์น ์๋น์ค์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ, ํด๋น ๋ฌธ์ ์ ์์ธ์ ํ์
ํ๋ ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋์ ์ ๋ณด๊ฐ ํ์ํ๋ค.
์ด๋ฐ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด์ ์ค์ํ ๊ธฐ๋ฅ์ ์คํ๋๋ ๋ถ๋ถ์ ์ ์ ํ ๋ก๊ทธ(log)๋ฅผ ๋จ๊ฒจ์ผ ํ๋ค.
์ผ๋ฐ์ ์ธ ๋ก๊ทธ ๊ธฐ๋ก์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ก๊ทธ๋ ์ฑ๋ฅ์ ๊ดํ ํต๊ณ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ค.
- ๋ก๊ทธ๋ ์ฌํํ๊ธฐ ํ๋ ๋ฒ๊ทธ์ ๋ํ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๋ค.
- ์ค์ ์ด ๊ฐ๋ฅํ ๋, ๋ก๊ทธ๋ ์๊ธฐ์น ๋ชปํ ํน์ ๋ฌธ์ ๋ค์ ๋๋ฒ๊ทธํ๊ธฐ ์ํด ๊ทธ ๋ฌธ์ ๋ค์ ์ฒ๋ฆฌํ๋๋ก ์ฝ๋๋ฅผ ์์ ํ์ฌ ๋ค์ ์ ์ฉํ์ง ์์๋, ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.
๐ก ๋ก๊น ๋ ๋ฒจ(Loggin Level)
๋ค์ ์์๋ก ๋ก๊น ์ด ๋๋ค.
DEBUG < INFO < WARNING < ERROR < CRITICAL
- DEBUG : ์์ธํ ์ ๋ณด
- INFO : ์ผ๋ฐ์ ์ธ ์ ๋ณด
- WARNING : ์์์น ๋ชปํ๊ฑฐ๋, ๊ฐ๊น์ด ๋ฏธ๋์ ๋ฐ์ํ ๋ฌธ์
- ERROR : ์๋ฌ ๋ก๊ทธ, ์ฌ๊ฐํ ๋ฌธ์
- CRITICAL : ํ๋ก๊ทธ๋จ ์์ฒด๊ฐ ์คํ๋์ง ์์ ์ ์๋ ๋ฌธ์
ํ์ด์ฌ ๋ก๊ฑฐ ๋ ๋ฒจ ์ค์ ์ ๋ฐ๋ผ, ํ์ ๋ ๋ฒจ์ ์ถ๋ ฅ๋์ง ์๋๋ค.
๊ธฐ๋ณธ ๋ก๊ฑฐ ๋ ๋ฒจ ์ธํ
์ WARNING ์ด๋ค. ๋๋ฌธ์ ์ค์ ์์ด๋ INFO, DEBUG๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.
๐ก python logger
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ๋ก๊น ์ด๋ ฅ์ ๋จ๊ธฐ๋ ๊ฒ์ด ์ข๋ค.
- ์๋ฒ ์์ ๋ก๊ทธ
- ์๋ฒ ํฌํธ ๋ฒํธ
- ํจ์ ํธ์ถ
- ๋ฐ์ดํฐ์ ์ ์ถ๋ ฅ
#์์ ์ฝ๋
import logging
if __name__ : '__main__':
logging.info("hello elice!")
์ ์ฝ๋๋ก ์คํํ๋ฉด, "hello elice!" ๊ฐ ์ถ๋ ฅ๋์ง ์๋๋ค. ์์์ ์ธ๊ธํ๋ฏ์ด, ๋ก๊น
์ ๊ธฐ๋ณธ ์ธํ
์ WARNING์ด๊ธฐ ๋๋ฌธ
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ๋ฉด "hello elice!" ๊ฐ ์ถ๋ ฅ์ด ๋ ๊น ? ์๋ ์ฝ๋์ ๊ฐ์ด ์ค์ ํ๋ฉด ์ถ๋ ฅ๋๋ค.
import logging
if __name__ : '__main__':
logger = logging.getLogger()
logger.setlevel(logging.DEBUG) # ๋ก๊น
๊ธฐ๋ณธ์ธํ
WARNING -> DEBUG๋ก ๋ณ๊ฒฝ
logger.info("hello elice!")
๐ Flask logger
ํ๋ผ์คํฌ๋ 0.3 ๋ฒ์ ๋ถํฐ logger๋ฅผ ํ๋ผ์คํฌ ๋ด๋ถ์์ ์ ๊ณตํ๊ธฐ ์์ํ๋ค. ๐ฎ
(ํ๋ผ์คํฌ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ก๊น
์ ์ ์ธํ๊ณ , ์ผ๋ฐ python logging์ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ๋ค. )
# ๋ ๋ฒจ์ ๋ฐ๋ฅธ ํจ์๊ฐ ์ด๋ฏธ ์์ด์, ๋ฐ๋ก ๋ก๊น
๋ ๋ฒจ ์ค์ ์ ์ํด๋ ๋๋ค.
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()
๐ก Flask logger ๊ตฌํ
from flask import Flask, render_template
app = Flask(__name__)
# .errorhandler(์๋ฌ์ฝ๋) : flask ๋ด๋ถ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์๋ฌ ํธ๋ค๋ฌ
# ํน์ ์๋ฌ์ ๋ํ์ฌ errorhandler๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ๋งค์นญ๋๋ค.
@app.errorhandler(404)
def page_not_found(error):
app.logger.error(error)
return "ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค."
@app.route("/")
def hello_elice():
return "Hello world!"
if __name__ == '__main__':
app.run()
'python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Flask] (6) ORM & SQLAlchemy (0) | 2021.01.28 |
---|---|
[Flask] (5) RDB - Flask Connection & ๊ฒ์ํ ์์ (0) | 2021.01.25 |
[Flask] (3) ๋ ๋๋ง ํ ํ๋ฆฟ & Jinja2 & ๊ฐ๋จํ ๊ฒ์ํ (0) | 2021.01.24 |
[Flask] (2) REST & HTTP Method & API/End Point (0) | 2021.01.22 |
[Flask] (1) Intro & URL Routing & Variable Rules & jsonify( ) (1) | 2021.01.21 |