컴퓨터/Python

flask git

풍경소리^^ 2022. 3. 23. 16:12

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