ํ๋ผ์คํฌ (Flask) - ํ์๊ฐ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (MVC ํจํด )
- -
*Flask ํ์๊ฐ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
*๊ตฌ์กฐ (Structure)
Flaskํด๋
โ โโโ templates (ํด๋)
โ โโโ register.html
โ
โ
โโโ app.py (์คํํ์ผ)
โโโ db.sqlite (์ด๊ฑด ์๋์ผ๋ก ์์ฑ๋จ)
โโโ models.py
* app.py
from flask import Flask, render_template, request, redirect #render_template์ผ๋ก htmlํ์ผ ๋ ๋๋ง
from models import db
import os
from models import Fcuser
app = Flask(__name__)
@app.route('/')
def hello():
return render_template("hello.html")
#GET = ํ์ด์ง๊ฐ ๋์ค๋๋ก ์์ฒญ. POST = ๋ฒํผ์ ๋๋ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค๋ ์์ฒญ/ ์์ฒญ์ ๋ณดํ์ธํ๋ ค๋ฉด request ์ํฌํธ ํ์
@app.route('/register', methods=['GET','POST'])
def register():
if request.method == 'GET':
return render_template("register.html")
else:
#ํ์์ ๋ณด ์์ฑ
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re_password')
print(password) # ๋ค์ด์ค๋ ํ์ธํด๋ณผ ์ ์๋ค.
if not (userid and username and password and re_password) :
return "๋ชจ๋ ์
๋ ฅํด์ฃผ์ธ์"
elif password != re_password:
return "๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํด์ฃผ์ธ์"
else: #๋ชจ๋ ์
๋ ฅ์ด ์ ์์ ์ผ๋ก ๋์๋ค๋ฉด ๋ฐ์๋ช
๋ น์คํ(DB์ ์
๋ ฅ๋จ)
fcuser = Fcuser()
fcuser.password = password #models์ FCuser ํด๋์ค๋ฅผ ์ด์ฉํด db์ ์
๋ ฅํ๋ค.
fcuser.userid = userid
fcuser.username = username
db.session.add(fcuser)
db.session.commit()
return "ํ์๊ฐ์
์๋ฃ"
return redirect('/')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__)) # database ๊ฒฝ๋ก๋ฅผ ์ ๋๊ฒฝ๋ก๋ก ์ค์ ํจ
dbfile = os.path.join(basedir, 'db.sqlite') # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ๊ณผ ๊ฒฝ๋ก
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True # ์ฌ์ฉ์์๊ฒ ์ํ๋ ์ ๋ณด๋ฅผ ์ ๋ฌ์๋ฃํ์๋๊ฐ TEARDOWN, ๊ทธ ์๊ฐ๋ง๋ค COMMIT์ ํ๋๋ก ํ๋ค.๋ผ๋ ์ค์
#์ฌ๋ฌ๊ฐ์ง ์์์ ธ์๋ ๋์๋ค์ Commit์ ํด์ฃผ์ด์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋จ. ์ด๋ฌํ ๋จ์๋ค์ ํธ๋ ์ ์
์ด๋ผ๊ณ ํจ.
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # Trueํ๋ฉด warrnig๋ฉ์์ง ์ ๋ฐ,
db.init_app(app) #์ด๊ธฐํ ํ db.app์ app์ผ๋ก ๋ช
์์ ์ผ๋ก ๋ฃ์ด์ค
db.app = app
db.create_all() # ์ด ๋ช
๋ น์ด ์์ด์ผ ์์ฑ๋จ. DB๊ฐ
app.run(host='127.0.0.1', port=5000, debug=True)
return render_template('xxxx.html') - template ํด๋ ์์ htmlํ์ผ์ ๋ ๋๋งํฉ๋๋ค.
@app.route('/register', methods=['GET','POST']) - GET ์ POST ๋๊ฐ์ง ๋ฉ์๋๋ฅผ ํ์ฉํฉ๋๋ค.
ํ์ฉํ์ง ์์ผ๋ฉด ์๋ ๊ทธ๋ฆผ์ฒ๋ผ Method Not Allowed ๋ฉ์์ง๊ฐ ๋ฐ์ํฉ๋๋ค.
์ถ๊ฐ๋ก POST, GET์ ๋๋ค ์ ๋ณด๋ฅผ ์๋ฒ๋ก ์ ๋ฌํ๊ธฐ์ํ ๊ธฐ๋ฅ์ ๋๋ค.
์ฐจ์ด์ ์ GET : ์ ์ฅ๋ ์ ๋ณด๋ฅผ ๋จ์ํ ์์ฒญํ ๋ ์ฌ์ฉ๋๋ฉฐ, url์ ์ ๋ณด์ ์ด๋ฆ์ด ๋ ธ์ถ๋ฉ๋๋ค.
POST : url์ ์ฟผ๋ฆฌ๊ฐ ๋ ธ์ถ๋์ง ์์ผ๋ฉฐ, ์์ฒญ์ ๋ฐ์ดํฐ ์์ ์ ํ์ด ์์ต๋๋ค.
POST๋ ํ๋ง๋๋ก ๋ฐ์ดํฐ์ ์์ ์ด ์๋๊ฒฝ์ฐ (๊ฒ์๊ธ ์์ฑ, ํ์๊ฐ์ ์ ๋ณด ๋ฐ๊ธฐ)
GET์ ๋จ์ํ ์ ๋ณด๋ฅผ ๋ณด๊ธฐ์ํ ์ฉ๋? (๊ฒ์๊ธ ์ฝ๊ธฐ, ํ์๊ฐ์ ์ฐฝ ๋ณด๊ธฐ)
*register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" 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" >
<div class="form-group">
<label for="userid">์์ด๋</label>
<input type="text" class="form-control" id="userid" placeholder="์์ด๋" name="userid"/>
<!-- id๋ ์ญ์ ํด๋ ๋๋๋ผ. ๋ง์ง๋ง์ name๊ณผ app.py์ get ๋ฉ์๋ ์ฌ์ฉํ๋ ๋ถ๋ถ์ด ์ผ์นํด์ผ ์์ํ๋ค -->
</div>
<div class="form-group">
<label for="username">์ฌ์ฉ์ ์ด๋ฆ</label>
<input type="text" class="form-control" id="username" placeholder="์ฌ์ฉ์ ์ด๋ฆ" name="username"/>
</div>
<div class="form-group">
<label for="password">๋น๋ฐ๋ฒํธ</label>
<input type="password" class="form-control" id="password" placeholder="๋น๋ฐ๋ฒํธ" name="password"/>
</div>
<div class="form-group">
<label for="re_password">๋น๋ฐ๋ฒํธํ์ธ</label>
<input type="password" class="form-control" id="re_password" placeholder="๋น๋ฐ๋ฒํธํ์ธ" name="re_password"/>
</div>
<button type="submit" class="btn btn-primary">๋ฑ๋ก</button>
</form>
</div>
</div>
</body>
</html>
form์ ๋ถํธ์คํธ๋ฉ(bootstrap)์ ์ด์ฉํ์ต๋๋ค.
<form method="POST" >: input์ ๊ฐ์ธ๋ ํ๊ทธ์ ๋ฉ์๋๋ฅผ ํ์ํด์ค์ผ ํฉ๋๋ค.
<input type="text" class="form-control" id="userid" placeholder="์์ด๋" name="userid"/>
*Models.py (๋ฐ์ดํฐ ๋ฒ ์ด์ค)
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() #SQLAlchemy๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ
class Fcuser(db.Model):
__tablename__ = 'fcuser' #ํ
์ด๋ธ ์ด๋ฆ : fcuser
id = db.Column(db.Integer, primary_key = True) #id๋ฅผ ํ๋ผ์ด๋จธ๋ฆฌํค๋ก ์ค์
password = db.Column(db.String(64)) #ํจ์ค์๋๋ฅผ ๋ฐ์์ฌ ๋ฌธ์์ด๊ธธ์ด
userid = db.Column(db.String(32)) #์ดํ ์์ ๋์ผ
username = db.Column(db.String(8))
์ฌ๊ธฐ๊น์ง ๋ง๋ค๊ณ app.py๋ฅผ ํ์ด์ฌ์์์ ์คํ์ํค๋ฉด
์ฌ๊ธฐ๊น์งํ๋ฉด ์์ฑ์ ๋๋ค. ์์ด๋, ์ด๋ฆ, ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ ํ, ์ ์ถ๋ฒํผ์ ๋๋ฅด๋ฉด db.sqlite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ ฅ๋ฉ๋๋ค.
*DB๋ก ์ ๋์ด๊ฐ๋์ง ํ์ธํ๊ธฐ
(๋น๋ฐ๋ฒํธ๋ input type='password' ๋ผ์ ๋๊ทธ๋ผ๋ฏธ๋ก ํ์๋์์ผ๋, 1234๋ก ์ ๋ ฅํ์์ต๋๋ค.)
์ ์ถ์ ๋๋ฅธ๋ค db.sqlite๋ฅผ ์ด์ด๋ณด๊ฒ ์ต๋๋ค.
์ ๋ค์ด๊ฐ ๋ชจ์ต์ ๋๋ค.
'๐ ํ์ด์ฌ (Python)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
<matplotlib> (pylab) - 2D, 3D ๋ฐ์ดํฐ ์๋ฃ ์๊ฐํ 2019.11.15
-
๋ฐ์ดํฐ ๋ฒ ์ด์ค ์๊ฐ ํ์๋ฐฉ๋ฒ - Timestamp (unix time) 2019.11.13
-
ํ์ด์ฌ (python) - ์ธ๋ถํ์ผ ์ฒ๋ฆฌ Pandas ( ์์ XSL, XLSX ํ์ผ ์ฝ๊ธฐ , ์ฐ๊ธฐ ) 2019.11.05
-
ํ์ด์ฌ (python) - ์ธ๋ถํ์ผ ์ฒ๋ฆฌ ( CSV ํ์ผ ์ฝ๊ธฐ, ์ฐ๊ธฐ ) 2019.11.04
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค