ํ๋ผ์คํฌ (Flask) ๋ก๊ทธ์ธ , ๋ก๊ทธ์์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (session ํ์ฉ)
- -
*์ง๋ ํฌ์คํ :https://infinitt.tistory.com/113?category=1071293
ํด๋ผ์ด์ธํธ(์ฌ์ฉ์)์ ์๋ฒ๊ฐ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ฟ ํค(Cookie)์ ์ธ์ (session).
์ฟ ํค๋ ์๊ฐ์ด ์ง๋๋ฉด ์๋ฉธํ๊ณ , ์๋ฒ์ ์์์ ํ์ฉํ์ง ์๊ณ ํด๋ผ์ด์ธํธ์ชฝ์ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ ๋ณด์๊ธฐ๋ฅ์ ํ์ฉํ ๋๋ ์ธ์ ์ ์ฌ์ฉํ๋ค.
ํ๋ผ์คํฌ์์๋ ์ธ์ ์ ๋์ ๋๋ฆฌํํ๋ก ์ ๊ณตํ๋ค. (์ฆ, Key๊ฐ์ ํตํด Value๋ฅผ ๋ถ๋ฌ์ค๋,,)
๋ฐ๋ผ์ ์ธ์ ๊ณผ, ํ์๊ฐ์ ๋ ๋ฐ์๋์๋ DB์ id ํ๋ , password ํ๋์ ์ผ์นํ๋์ง ํ์ธํ๋ฉด ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
๋ฐ๋๋ก, ๋ก๊ทธ์์์ ์ธ์ ์ ์ ๊ฑฐํ๋ฉด ๋. (pop์ด๋ remove)
* ํ๋ผ์คํฌ์์์ session ์ฌ์ฉ
from flask import session
์ผ๋จ import๊ฐ ํ์ํ๋ค.
*๊ตฌ์กฐ (Structure)
Flaskํด๋
โ โโโ templates (ํด๋)
โ โโโ register.html
โ โโโ login.html
โ โโโ hello.html
โโโ app.py (์คํํ์ผ)
โโโ db.sqlite
โโโ models.py
โโโ forms.py (ํ๋์์ ์ด๋ฒํฌ์คํ ์์ ๋ณ๊ฒฝํ ํ์ผ๋ค)
*๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
*login.html
<html>
<head>
<meta charset='utf-8'/>
<meta name='viewport' content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous">
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>๋ก๊ทธ์ธ</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="POST" >
{{form.csrf_token}}
<div class="form-group">
{{form.userid.label("์์ด๋")}}
{{form.userid(class="form-control", placeholder="์์ด๋")}}
</div>
<div class="form-group">
{{form.password.label("๋น๋ฐ๋ฒํธ")}}
{%if form.password.errors%}
<!-- ๋ก๊ทธ์ธ ์คํจ์ errors/ passwordํ๋์ ๋ชจ๋ ์๋ฌ๋ฅผ ๊ฐ๊ณ ์๋ค. -->
{{form.password.errors.0}}
<!--0 : ์ฒซ๋ฒ์งธ ์๋ฌ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ ํ๊ฒ ๋ค ๋ผ๋ ๋ป -->
{%endif%}
{{form.password(class="form-control", placeholder="๋น๋ฐ๋ฒํธ")}}
</div>
<button type="submit" class="btn btn-primary">๋ก๊ทธ์ธ</button>
</form>
</div>
</div>
</div>
</body>
</html>
์ง๋ ํฌ์คํ ๋ ๋ง๋ค์๋ ํ์๊ฐ์ ํผ์์ ํ์์๋ ๋ถ๋ถ์ ์ญ์ ํ์ฌ ๋ง๋ญ๋๋ค. (์ฌ์ฉ์์ด๋ฆ, ๋น๋ฐ๋ฒํธ ์ฌํ์ธ์ ํ์ X)
*app.py
import os #์ ๋๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ธฐ ์ํ Os๋ชจ๋ ์ํฌํธ
from flask import Flask
from flask import request #ํ์์ ๋ณด ์ ์ถํ์๋ ๋ฐ์์ค๊ธฐ ์ํ request, post์์ฒญ์ ํ์ฑํ์ํค๊ธฐ ์ํจ
from flask import redirect #ํ์ด์ง ์ด๋์ํค๋ ํจ์
from flask import render_template
from models import db
from models import Fcuser
from flask import session
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm, LoginForm
app = Flask(__name__)
@app.route('/register', methods=['GET','POST']) #๊ฒ, ํฌ์คํธ ๋ฉ์๋ ๋๋ค ์ฌ์ฉ
def register(): #get ์์ฒญ ๋จ์ํ ํ์ด์ง ํ์ post์์ฒญ ํ์๊ฐ์
-๋ฑ๋ก์ ๋๋ ์๋ ์ ๋ณด ๊ฐ์ ธ์ค๋๊ฒ
form = RegisterForm()
if form.validate_on_submit(): # POST๊ฒ์ฌ์ ์ ํจ์ฑ๊ฒ์ฌ๊ฐ ์ ์์ ์ผ๋ก ๋์๋์ง ํ์ธํ ์ ์๋ค. ์
๋ ฅ ์ํ๊ฒ๋ค์ด ์๋์ง ํ์ธ๋จ.
#๋น๋ฐ๋ฒํธ = ๋น๋ฐ๋ฒํธ ํ์ธ -> EqulaTo
fcuser = Fcuser() #models.py์ ์๋ Fcuser
fcuser.userid = form.data.get('userid')
fcuser.username = form.data.get('username')
fcuser.password = form.data.get('password')
print(fcuser.userid,fcuser.password) #ํ์๊ฐ์
์์ฒญ์ ์ฝ์์ฐฝ์ ID๋ง ์ถ๋ ฅ (ํ์ธ์ฉ, ๋ฑํ ํ์์์)
db.session.add(fcuser) # id, name ๋ณ์์ ๋ฃ์ ํ์์ ๋ณด DB์ ์ ์ฅ
db.session.commit() #์ปค๋ฐ
return "๊ฐ์
์๋ฃ" #post์์ฒญ์ผ์๋ '/'์ฃผ์๋ก ์ด๋. (ํ์๊ฐ์
์๋ฃ์ ํ๋ฉด์ด๋)
return render_template('register.html', form=form)
@app.route('/login', methods=['GET','POST'])
def login():
form = LoginForm() #๋ก๊ทธ์ธ ํผ ์์ฑ
if form.validate_on_submit(): #์ ํจ์ฑ ๊ฒ์ฌ
session['userid'] = form.data.get('userid') #form์์ ๊ฐ์ ธ์จ userid๋ฅผ session์ ์ ์ฅ
return redirect('/') #๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ํํ๋ฉด์ผ๋ก redirect
return render_template('login.html', form=form)
@app.route('/')
def hello():
userid = session.get('userid', None)
return render_template('hello.html',userid=userid) # ์ด๋ฒ ํฌ์คํ
์๋ ํ์์์(์ง๋ํฌ์คํ
๊บผ)
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__)) #dbํ์ผ์ ์ ๋๊ฒฝ๋ก๋ก ์์ฑ
dbfile = os.path.join(basedir, 'db.sqlite')#dbํ์ผ์ ์ ๋๊ฒฝ๋ก๋ก ์์ฑ
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
#sqlite๋ฅผ ์ฌ์ฉํจ. (๋ง์ฝ mysql์ ์ฌ์ฉํ๋ค๋ฉด, id password ๋ฑ... ๋ ํ์ํ๊ฒ๋ง๋ค.)
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
#์ฌ์ฉ์ ์์ฒญ์ ๋๋ง๋ค ์ปค๋ฐ(๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ,์์ ,์ญ์ ๋ฑ์ ๋์์ ์์๋จ๋ ๊ฒ๋ค์ ์คํ๋ช
๋ น)์ ํ๋ค.
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
#์์ ์ฌํญ์ ๋ํ track์ ํ์ง ์๋๋ค. True๋ก ํ๋ค๋ฉด warning ๋ฉ์์ง์ ๋ฐ
app.config['SECRET_KEY'] = 'wcsfeufhwiquehfdx'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all() #db ์์ฑ
app.run(host='127.0.0.1', port=5000, debug=True)
#ํฌํธ๋ฒํธ๋ ๊ธฐ๋ณธ 5000, ๊ฐ๋ฐ๋จ๊ณ์์๋ debug๋ True
*forms.py
from flask_wtf import FlaskForm
from models import Fcuser
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, EqualTo
class RegisterForm(FlaskForm):
userid = StringField('userid', validators=[DataRequired()])
username = StringField('username', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired(), EqualTo('re_password')]) #equalTo("ํ๋๋ค์")
re_password = PasswordField('re_password', validators=[DataRequired()])
class LoginForm(FlaskForm):
class UserPassword(object):
def __init__(self, message=None):
self.message = message
def __call__(self,form,field):
userid = form['userid'].data
password = field.data
fcuser = Fcuser.query.filter_by(userid=userid).first()
if fcuser.password != password:
# raise ValidationError(message % d)
raise ValueError('Wrong password')
userid = StringField('userid', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired(), UserPassword()])
*hello.html (ํํ๋ฉด)
<strong>Hello World!</strong>
{%if userid%}
{{userid}}
{%endif%}
ํ์๊ฐ์ ์ ํ์๋ ์์ด๋, ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํด์ผ๋ง ๋ก๊ทธ์ธ์ด ๋ฉ๋๋ค.
๋ก๊ทธ์ธ์ด ์ฑ๊ณต๋๋ฉด redirect('/')์ ์ํด์ ํํ๋ฉด์ผ๋ก ์ด๋๋๊ณ , Hello + ์ฌ์ฉ์ ์์ด๋ ๊ฐ ํ๋ฉด์ ๋ ๋๋ง๋ฉ๋๋ค.
*๋ก๊ทธ์์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
๋ก๊ทธ์์์ ๊ฐ๋จํฉ๋๋ค. ์ฌ์ฉ์์๊ฒ ๋ฐ์๋ ์ธ์ ์ ์ญ์ ํ๋ฉด ๋์ ๋๋ค.
*app.py์ ์ถ๊ฐ
@app.route('/logout',methods=['GET'])
def logout():
session.pop('userid',None)
return redirect('/')
*hello.html (ํํ๋ฉด์ ๋ก๊ทธ์์ ๋ฒํผ ์์ฑํ๊ธฐ)
<strong>Hello World!</strong>
{%if userid%}
{{userid}} <button type="button" onclick="location.href='/logout' ">๋ก๊ทธ ์์</button>
{%endif%}
๋ก๊ทธ์์์ ๋๋ฅด๊ฒ ๋๋ฉด
์ฌ์ฉ์ ID์ ๋ก๊ทธ์์ button์ด ์ฌ๋ผ์ง๋๋ค.
'๐ ํ์ด์ฌ (Python)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
ํ๋ผ์คํฌ (Flask) - todo app ํ ์ผ ๋ฆฌ์คํธ ๊ด๋ฆฌ (api, crud) 2020.02.22
-
ํ์ด์ฌ (Python) - (์ ๋ ฌ ์ด์ ๋ฆฌ) sort( ), sorted( ) , ํน์ key๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ ,์ด์ค ๋ฆฌ์คํธ ์ ๋ ฌ , ๋ค์ค ์กฐ๊ฑด ์ ๋ ฌ 2020.02.10
-
ํ๋ผ์คํฌ (Flask) Static ํ์ผ ์ ์ฉํ๊ธฐ. (CSS, JS) url_for 2020.02.07
-
ํ์ด์ฌ (python) ๋ฆฌ์คํธ๊ฐ ๋น์ด์๋์ง ํ์ธ, ๋น ๋ฐฐ์ด ํ์ธํ๊ธฐ 2020.02.06
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค