python>flask>fastcampus>
python -m venv ./venv
ctrl + shift + p
python select interpreter
가상환경 command prompt
터미널+
cmd
pip list
pip install flask
B:\python\flask\project\venv\Scripts\python.exe -m pip install --upgrade pip
app.py--------------------
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '안녕 Flask!'
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
====================
python app.py
http://192.168.1.65:5000/
안녕 Flask
Chapter 01. 플라스크 기본 - 04.Flask-SQLAlchemy 소개
model 부분 지원
pip install flask-sqlalchemy
app.py--------------------
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db = SQLAlchemy(app)
class Test(db.Model):
__tablename__ = 'test_table'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
db.create_all()
@app.route('/')
def hello():
return '<h1>안녕 Flask!</h1>'
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
====================
sqlite3 db.sqlite
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite> .tables
test_table
sqlite> .schema
CREATE TABLE test_table (
id INTEGER NOT NULL,
name VARCHAR(32),
PRIMARY KEY (id),
UNIQUE (name)
);
sqlite> .quit
app.py--------------------
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db = SQLAlchemy(app)
db.create_all()
@app.route('/')
def hello():
return '<h1>안녕 Flask!</h1>'
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
====================
Chapter 01. 플라스크 기본 - 05.Jinja2 소개
cd B:\python\flask\project\venv\Scripts
activate
app.py--------------------
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
====================
templates>hello.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Jinja2 Test</title>
</head>
<body>
<h1>Hello Flask</h1>
</body>
</html>
====================
models.py--------------------
import os
from app import app
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db = SQLAlchemy(app)
====================
파일 분리후 여기까지 정상 작동
Chapter 02. 기능 만들기, 회원가입 - 01. 모델 만들기, 회원
crud
app.py--------------------
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
====================
models.py--------------------
import os
from app import app
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db = SQLAlchemy(app)
====================
models.py--------------------
import os
from app import app
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db = SQLAlchemy(app)
class Fcuser(db.Model): // ← 회원정보
__tablename__ = 'fcuser'
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(64))
userid = db.Column(db.String(32))
username = db.Column(db.String(8))
====================
ctrl + shift + p
python select interpreter
가상환경 command prompt
app.py--------------------
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.run(host='0.0.0.0', port='5000', debug=True)
====================
models.py--------------------
import os
# from app import app
from flask_sqlalchemy import SQLAlchemy
# db = SQLAlchemy(app)
db = SQLAlchemy()
class Fcuser(db.Model):
__tablename__ = 'fcuser'
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(64))
userid = db.Column(db.String(32))
username = db.Column(db.String(8))
====================
app.py--------------------
import os
from flask import Flask
from flask import render_template
from models import db
app = Flask(__name__)
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db.init_app(app) // ← 여러가지 설정 값 초기화
db.app = app // 데이터베이스의 app을 명시적으로 연결
db.create_all() // ← 데이타베이스 생성
app.run(host='0.0.0.0', port='5000', debug=True)
====================
07:44
models.py--------------------
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Fcuser(db.Model):
__tablename__ = 'fcuser'
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(64))
userid = db.Column(db.String(32))
username = db.Column(db.String(8))
====================
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite> .tables
test_table
sqlite> .schema
CREATE TABLE test_table (
id INTEGER NOT NULL,
name VARCHAR(32),
PRIMARY KEY (id),
UNIQUE (name)
);
sqlite> .quit
python app.py
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<title>Document</title>
</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" action="."></form>
</div>
</div>
</div>
</body>
</html>
====================
app.py--------------------
import os
from flask import Flask
from flask import render_template
from models import db
app = Flask(__name__)
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
Chapter 02. 기능 만들기, 회원가입 - 02. 뷰 만들기, 회원
https://getbootstrap.com/docs/4.3/getting-started/introduction/
Introduction
Get started with Bootstrap, the world’s most popular framework for building responsive, mobile-first sites, with jsDelivr and a template starter page.
getbootstrap.com
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>register.html</title>
</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" action="."></form>
</div>
</div>
</div>
</body>
</html>
====================
app.py--------------------
import os
from flask import Flask
from flask import render_template
from models import db
app = Flask(__name__)
@app.route('/register')
def register():
return render_template('register.html')
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
192.168.1.65:5000/register
05:24
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>register.html</title>
</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" action=".">
<div class="form-group">
<label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid">
</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>
</div>
</body>
</html>
====================
Chapter 02. 기능 만들기, 회원가입 - 03. 컨트롤러 만들기, 회원
app.py--------------------
import os
from flask import Flask
from flask import request // ←
from flask import render_template
from models import db
app = Flask(__name__)
@app.route('/register', methods=['GET','POST']) // ←
def register():
print(request.method)
return render_template('register.html')
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>register.html</title>
</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">
</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>
</div>
</body>
</html>
====================
app.py--------------------
import imp
import os
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from models import db
from models import Fcuser // ←
app = Flask(__name__)
@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(userid) // ←
return redirect('/')
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from models import db
from models import Fcuser // ←
app = Flask(__name__)
@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') // ←
if not (userid and username and password and re_password): // ←
return render_template('register.html') // ←
if password != re_password: // ←
return render_template('register.html') // ←
fcuser = Fcuser() // ←
fcuser.userid = userid // ←
fcuser.username = username // ←
fcuser.password = password // ←
db.session.add(fcuser) // ←
db.session.commit() // ←
return redirect('/')
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
git bash
깃 환경설정
git config --global user.name "jeong~"
git config --global user.email "i~@gmail.com"
git config --list
vscode -터미널-새터미널Ctrl+Shift+`
git init
여기서 잠시만요
.gitignore
https://github.com/pallets/flask/blob/main/.gitignore
모르겠다
git add .
git status
git commit -m "flask first commit"
git remote add origin https://github.com/jeongyongman/flask_fastcampus.git
git remote -v
git push origin master
Chapter 02. 기능 만들기, 회원가입 - 04. Flask-WTF를 활용한 Validation-1
form 관리
pip install Flask-WTF
csrf보호기능
validation 값에 대한 검증
forms.py--------------------
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms import PasswordField
from wtforms.validators import DataRequired
class RegisterForm(FlaskForm):
userid = StringField('userid', validators=[DataRequired()])
username = StringField('username', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired()])
====================
csrf
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from models import Fcuser
app = Flask(__name__)
@app.route('/register', methods=['GET','POST'])
def register():
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if (userid and username and password and re_password) and password != re_password:
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return redirect('/')
return render_template('register.html')
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm // ←
from models import Fcuser
app = Flask(__name__)
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm() // ←
if request.method == 'POST':
userid = request.form.get('userid')
username = request.form.get('username')
password = request.form.get('password')
re_password = request.form.get('re-password')
if (userid and username and password and re_password) and password != re_password:
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return redirect('/')
return render_template('register.html', form=form) // ←
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>register.html</title>
</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"> -->
{{ form.userid.label }} // ←
{{ form.userid }} // ←
</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>
</div>
</body>
</html>
====================
192.168.1.65:5000/register
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>register.html</title>
</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"> -->
{{ form.userid.label("아이디") }} // ←
{{ form.userid(class="form-control", placeholder="아이디") }} // ←
</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>
</div>
</body>
</html>
====================
Chapter 02. 기능 만들기, 회원가입 - 05. Flask-WTF를 활용한 Validation-2
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>register.html</title>
</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"> -->
{{ form.userid.label("아이디") }}
{{ form.userid(class="form-control", placeholder="아이디") }}
</div>
<div class="form-group">
<!-- <label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username"> -->
{{ form.username.label("사용자 이름") }}
{{ form.username(class="form-control", placeholder="사용자 이름") }}
</div>
<div class="form-group">
<!-- <label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password"> -->
{{ form.password.label("비밀번호") }}
{{ form.password(class="form-control", placeholder="비밀번호") }}
</div>
<div class="form-group">
<!-- <label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password"> -->
{{ form.repassword.label("비밀번호 확인") }}
{{ form.repassword(class="form-control", placeholder="비밀번호 확인") }}
</div>
<button type="submit" class="btn btn-primary">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
====================
forms.py--------------------
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms import PasswordField
from wtforms.validators import DataRequired
class RegisterForm(FlaskForm):
userid = StringField('userid', validators=[DataRequired()])
username = StringField('username', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired()]) // ←
repassword = PasswordField('repassword', validators=[DataRequired()]) // ←
====================
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<title>register.html</title>
</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">
<!-- <label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid"> -->
{{ form.userid.label("아이디") }}
{{ form.userid(class="form-control", placeholder="아이디") }}
</div>
<div class="form-group">
<!-- <label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username"> -->
{{ form.username.label("사용자 이름") }}
{{ form.username(class="form-control", placeholder="사용자 이름") }}
</div>
<div class="form-group">
<!-- <label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password"> -->
{{ form.password.label("비밀번호") }}
{{ form.password(class="form-control", placeholder="비밀번호") }}
</div>
<div class="form-group">
<!-- <label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password"> -->
{{ form.repassword.label("비밀번호 확인") }}
{{ form.repassword(class="form-control", placeholder="비밀번호 확인") }}
</div>
<button type="submit" class="btn btn-primary">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
====================
유효성검사
form.py--------------------
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms import 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('repassword')]) // ←
repassword = PasswordField('repassword', validators=[DataRequired()])
====================
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm
from models import Fcuser
app = Flask(__name__)
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm() // ←
if form.validate_on_submit(): // ←
fcuser = Fcuser()
fcuser.userid = userid
fcuser.username = username
fcuser.password = password
db.session.add(fcuser)
db.session.commit()
return redirect('/')
return render_template('register.html', form=form)
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm
from models import Fcuser
app = Flask(__name__)
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
fcuser = Fcuser()
fcuser.userid = form.data.get('userid') // ←
fcuser.username = form.data.get('username') // ←
fcuser.password = form.data.get('password') // ←
db.session.add(fcuser)
db.session.commit()
print('Success!') // ←
return redirect('/')
return render_template('register.html', form=form)
@app.route('/')
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
git add .
git commit -m "flask-wtf를 활용한 validation"
git push origin master
Chapter 03. Static 파일 관리하기 - 01. static 파일 관리하기(CDN 소개)
static>css>style.css--------------------
label {font-size: 20px;font-weight: 700;}
====================
templates>register.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<!-- <link rel="stylesheet" href="../static/css/style.css"> -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"> // ←
<title>register.html</title>
</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">
<!-- <label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid"> -->
{{ form.userid.label("아이디") }}
{{ form.userid(class="form-control", placeholder="아이디") }}
</div>
<div class="form-group">
<!-- <label for="username">사용자 이름</label>
<input type="text" class="form-control" id="username" placeholder="사용자 이름" name="username"> -->
{{ form.username.label("사용자 이름") }}
{{ form.username(class="form-control", placeholder="사용자 이름") }}
</div>
<div class="form-group">
<!-- <label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password"> -->
{{ form.password.label("비밀번호") }}
{{ form.password(class="form-control", placeholder="비밀번호") }}
</div>
<div class="form-group">
<!-- <label for="re-password">비밀번호 확인</label>
<input type="password" class="form-control" id="re-password" placeholder="비밀번호 확인" name="re-password"> -->
{{ form.repassword.label("비밀번호 확인") }}
{{ form.repassword(class="form-control", placeholder="비밀번호 확인") }}
</div>
<button type="submit" class="btn btn-primary">등록</button>
</form>
</div>
</div>
</div>
</body>
</html>
====================
git add .
git commit -m "static-css 파일 관리하기"
git push origin master
Chapter 04. 기능 만들기, 로그인 - 01. 퀴즈, 로그인 뷰와 컨트롤러 일부 만들기
templates>login.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<!-- <link rel="stylesheet" href="../static/css/style.css"> -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<title>login.html</title>
</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">
<!-- <label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid"> -->
{{ form.userid.label("아이디") }}
{{ form.userid(class="form-control", placeholder="아이디") }}
</div>
<div class="form-group">
<!-- <label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password"> -->
{{ form.password.label("비밀번호") }}
{{ form.password(class="form-control", placeholder="비밀번호") }}
</div>
<button type="submit" class="btn btn-primary">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
====================
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm, LoginForm // ←
from models import Fcuser
app = Flask(__name__)
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
fcuser = Fcuser()
fcuser.userid = form.data.get('userid')
fcuser.username = form.data.get('username')
fcuser.password = form.data.get('password')
db.session.add(fcuser)
db.session.commit()
print('Success!')
return redirect('/')
return render_template('register.html', form=form)
@app.route('/login', methods=['GET','POST']) // ←
def login():
form = LoginForm()
# if form.validate_on_submit():
# fcuser = Fcuser()
# fcuser.userid = form.data.get('userid')
# fcuser.password = form.data.get('password')
# db.session.add(fcuser)
# db.session.commit()
# print('Success!')
# return redirect('/')
return render_template('login.html', form=form)
@app.route('/', methods=['GET','POST'])
def hello():
return render_template('hello.html')
if __name__ == "__main__":
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
forms.py--------------------
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms import 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('repassword')])
repassword = PasswordField('repassword', validators=[DataRequired()])
class LoginForm(FlaskForm): // ←
userid = StringField('userid', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired()])
====================
git add .
git commit -m "flask - 로그인 뷰와 컨트롤러 일부 만들기"
git push origin master
Chapter 04. 기능 만들기, 로그인 - 02. 세션이란
Chapter 04. 기능 만들기, 로그인 - 03. 로그인 완성하기
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import session // ←
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm, LoginForm
from models import Fcuser
app = Flask(__name__)
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
fcuser = Fcuser()
fcuser.userid = form.data.get('userid')
fcuser.username = form.data.get('username')
fcuser.password = form.data.get('password')
db.session.add(fcuser)
db.session.commit()
print('Success!')
return redirect('/')
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') // ←
# fcuser = Fcuser()
# fcuser.userid = form.data.get('userid')
# fcuser.password = form.data.get('password')
# db.session.add(fcuser)
# db.session.commit()
# print('Success!')
return redirect('/')
return render_template('login.html', form=form)
@app.route('/', methods=['GET','POST'])
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__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
templates>hello.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello.html</title>
</head>
<body>
<h1>Hello Flask - Jinja2</h1>
{{ userid }} // ←
</body>
</html>
====================
templates>hello.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello.html</title>
</head>
<body>
<h1>Hello Flask - Jinja2</h1>
{% if userid %} // ←
{{ userid }} // ←
{% endif %} // ←
</body>
</html>
====================
192.168.1.65:5000/login
fast
1234
192.168.1.65:5000
fast
04:29
forms.py--------------------
from models import Fcuser
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms import 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('repassword')])
repassword = PasswordField('repassword', 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 ValueError('Wrong password')
userid = StringField('userid', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired(), UserPassword()]) // ←
====================
python app.py
192.168.1.65:5000/register
fastcampus
정용만
1234
1234
192.168.1.65/login
fastcampus
1234
로그인
templates>login.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/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://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<!-- <link rel="stylesheet" href="../static/css/style.css"> -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<title>login.html</title>
</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">
<!-- <label for="userid">아이디</label>
<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid"> -->
{{ form.userid.label("아이디") }}
{{ form.userid(class="form-control", placeholder="아이디") }}
</div>
<div class="form-group">
<!-- <label for="password">비밀번호</label>
<input type="password" class="form-control" id="password" placeholder="비빌번호" name="password"> -->
{{ form.password.label("비밀번호") }}
{% if form.password.errors %} // ←
{{ form.password.errors.0 }} // ←
{% endif %} // ←
{{ form.password(class="form-control", placeholder="비밀번호") }}
</div>
<button type="submit" class="btn btn-primary">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
====================
Chapter 05. 기능 만들기, 로그아웃 - 01. 로그아웃 만들기
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import session
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm, LoginForm
from models import Fcuser
app = Flask(__name__)
@app.route('/logout', methods=['GET']) // ←
def logout(): // ←
session.pop('userid', None) // ←
return redirect('/') // ←
@app.route('/login', methods=['GET','POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
session['userid'] = form.data.get('userid')
return redirect('/')
return render_template('login.html', form=form)
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
fcuser = Fcuser()
fcuser.userid = form.data.get('userid')
fcuser.username = form.data.get('username')
fcuser.password = form.data.get('password')
db.session.add(fcuser)
db.session.commit()
print('Success!')
return redirect('/')
return render_template('register.html', form=form)
@app.route('/', methods=['GET','POST'])
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__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
app.run(host='0.0.0.0', port='5000', debug=True)
====================
templates>hello.html--------------------
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hello.html</title>
</head>
<body>
<h1>Hello Flask - Jinja2</h1>
{% if userid %}
{{ userid }} <a href="/logout">로그아웃</a> // ←
{% endif %}
</body>
</html>
====================
git add .
git commit -m "기능만들기-로그아웃"
git push origin master
Chapter 06. 배포하기 - 01. pythonanywhere에 배포하기
app.py--------------------
import os
from flask import Flask
from flask import request
from flask import session
from flask import redirect
from flask import render_template
from models import db
from flask_wtf.csrf import CSRFProtect
from forms import RegisterForm, LoginForm
from models import Fcuser
app = Flask(__name__)
@app.route('/logout', methods=['GET'])
def logout():
session.pop('userid', None)
return redirect('/')
@app.route('/login', methods=['GET','POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
session['userid'] = form.data.get('userid')
return redirect('/')
return render_template('login.html', form=form)
@app.route('/register', methods=['GET','POST'])
def register():
form = RegisterForm()
if form.validate_on_submit():
fcuser = Fcuser()
fcuser.userid = form.data.get('userid')
fcuser.username = form.data.get('username')
fcuser.password = form.data.get('password')
db.session.add(fcuser)
db.session.commit()
print('Success!')
return redirect('/')
return render_template('register.html', form=form)
@app.route('/', methods=['GET','POST'])
def hello():
userid = session.get('userid', None)
return render_template('hello.html', userid=userid)
basedir = os.path.abspath(os.path.dirname(__file__))
dbfile = os.path.join(basedir,'db.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = False
app.config['SECRET_KEY'] = 'ddd'
csrf = CSRFProtect()
csrf.init_app(app)
db.init_app(app)
db.app = app
db.create_all()
if __name__ == "__main__":
app.run(host='0.0.0.0', port='5000', debug=True)
====================
https://www.pythonanywhere.com/user/miero/
Login: PythonAnywhere
It's always a pleasure to hear from you! Ask us a question, or tell us what you love or hate about PythonAnywhere. We'll get back to you over email ASAP. Sorry, there was an error connecting to the server. Please try again in a few moments... Sorry, we hav
www.pythonanywhere.com
file
upload a file
압축파일 올리고
open bash console here
unzip fastcampus.zip -d fastcampus
virtualenv --python=python3.9 flask_fastcampus
source flask_fastcampus/bin/activate
pip install flask flask-wtf flask-sqlalchemy
exit
web
add a new web app
next
manual configuration
python3.9
next
code
/home/miero/fastcampus
miero_pythonanywhere_com_wsgi.py--------------------
import sys
# The "/home/miero" below specifies your home
# directory -- the rest should be the directory you uploaded your Flask
# code to underneath the home directory. So if you just ran
# "git clone git@github.com/myusername/myproject.git"
# ...or uploaded files to the directory "myproject", then you should
# specify "/home/miero/myproject"
path = '/home/miero/fastcampus'
if path not in sys.path:
sys.path.append(path)
from app import app as application # noqa
====================
web
virtualenv
/home/miero/flask_fastcampus
reload miero.pythonanywhere.com
miero.pythonanywhere.com
Chapter 07. REST의 소개 - 01. 백엔드와 프론트엔드
'컴퓨터 > Python' 카테고리의 다른 글
flask slack (0) | 2022.04.08 |
---|---|
flask_fastcampus2 (0) | 2022.04.01 |
python ticket.interpark (0) | 2022.02.18 |
python 엑셀사용하기 업무의잔머리 (0) | 2021.08.21 |
mysql fetchall 이해하기 (0) | 2021.06.23 |