Python 로그인 설명
Python 로그인 설명
메인 프로그램에서 "/" 유입
세션 여부를 판단해서 로그인 페이지나 메인 페이지로 이동
@app.route('/', methods=['GET', 'POST'])
def mainpage():
userid = session.get('userid',None)
form = LoginForm() #로그인폼
if userid is None:
return render_template('login.html', form=form)
else:
msgList = postgresql.getMsg()
return render_template("index.html", msgList=msgList, userid=userid)
로그인 페이지
<html>
<head>
<meta charset='utf-8'/>
<meta name='viewport' content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous">
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>로그인</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="POST" action="/login">
{{form.csrf_token}}
<div class="form-group">
{{form.userid.label("아이디")}}
{{form.userid(class="form-control", placeholder="아이디")}}
</div>
<div class="form-group">
{{form.password.label("비밀번호")}}
{%if form.password.errors%}
<!-- 로그인 실패시 errors/ password필드의 모든 에러를 갖고있다. -->
{{form.password.errors.0}}
<!--0 : 첫번째 에러메시지를 출력 하겠다 라는 뜻 -->
{%endif%}
{{form.password(class="form-control", placeholder="비밀번호")}}
<p>
{{message}}
</div>
<button type="submit" class="btn btn-primary">로그인</button>
</form>
</div>
</div>
</div>
</body>
</html>
메인 페이지 로그인 처리
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm() #로그인폼
try:
if form.validate_on_submit(): #유효성 검사
logger.debug('{}가 로그인 했습니다'.format(form.data.get('userid')))
session['userid']=form.data.get('userid') #form에서 가져온 userid를 세션에 저장
msgList = postgresql.getMsg()
return render_template("index.html", msgList=msgList, userid=form.data.get('userid')) #성공하면 main.html로
except ValueError as ve:
logger.debug('로그인 실패 ' + str(ve))
return render_template('login.html', form=form, message=str(ve))
Form
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms import PasswordField
from wtforms.validators import DataRequired, EqualTo
from models import User #models.py 가져옴
class RegisterForm(FlaskForm):
userid = StringField('userid', validators=[DataRequired()])
username = StringField('username', validators=[DataRequired()])
email = StringField('email', validators=[DataRequired()])
password = PasswordField('password', validators=[DataRequired(), EqualTo('re_password')]) #비밀번호 확인
re_password = PasswordField('re_password', validators=[DataRequired()])
class LoginForm(FlaskForm):
class UserPassword(object):
def __init__(self, message=None):
self.message = message
def __call__(self, form, field):
userid = form['userid'].data
password = field.data
usertable = User.query.filter_by(userid=userid).first()
if usertable is None or usertable.password != password:
raise ValueError('로그인 실패 비밀번호 틀림')
userid = StringField('userid', validators=[DataRequired('ID를 입력하여 주세요 !')])
password = PasswordField('password', validators=[DataRequired('패스워드를 입력해 주세요'), UserPassword()])
객체
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() #SQLAlchemy를 사용해 데이터베이스 저장
class User(db.Model): #데이터 모델을 나타내는 객체 선언
__tablename__ = 'user_table' #테이블 이름
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(32), unique=True, nullable=False)
email = db.Column(db.String(32), unique=True, nullable=False)
userid = db.Column(db.String(32), unique=True, nullable=False)
password = db.Column(db.String(8), nullable=False)
# def __init__(self, email, password):
# self.email = email
# self.set_password(password)
#
def set_password(self, password):
self.password = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password, password)
사용자 등록 페이지
<html>
<head>
<meta charset='utf-8'/>
<meta name='viewport' content="width=device-width, initial-scale=1, shrink-to-fit=no"/>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous">
</script>
</head>
<body>
<div class="container">
<div class="row mt-5">
<h1>회원가입</h1>
</div>
<div class="row mt-5">
<div class="col-12">
<form method="POST" > <!--엑션 삭제해야됌-->
{{form.csrf_token}}
<div class="form-group">
<!-- <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="username">이메일</label>
<input type="text" class="form-control" id="email" placeholder="사용자메일" name="email" /> -->
{{form.email.label("사용자 이메일")}}
{{form.email(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.re_password.label("비밀번호 확인")}}
{{form.re_password(class="form-control", placeholder="비밀번호 확인")}}
</div>
<button type="submit" class="btn btn-primary">제출</button>
</form>
</div>
</div>
</div>
</body>
</html>
메인 페이지 사용자 등록
@app.route('/register', methods=['GET','POST']) #겟, 포스트 메소드 둘다 사용
def register(): #get 요청 단순히 페이지 표시 post요청 회원가입-등록을 눌렀을때 정보 가져오는것
form = RegisterForm()
if form.validate_on_submit(): # POST검사의 유효성검사가 정상적으로 되었는지 확인할 수 있다. 입력 안한것들이 있는지 확인됨.
#비밀번호 = 비밀번호 확인 -> EqulaTo
user = User() #models.py에 있는 user
user.userid = form.data.get('userid')
user.username = form.data.get('username')
user.email = form.data.get('email')
user.password = form.data.get('password')
print(user.userid,user.password) #회원가입 요청시 콘솔창에 ID만 출력 (확인용, 딱히 필요없음)
db.session.add(user) # id, name 변수에 넣은 회원정보 DB에 저장
db.session.commit() #커밋
return "가입 완료" #post요청일시는 '/'주소로 이동. (회원가입 완료시 화면이동)
return render_template('register.html', form=form)