오도원입니다.

건강과 행복을 위하여

PNU DSC/Solution Challenge

Flask 11. 로그인 페이지 만들기

오도원공육사 2020. 3. 10. 23:46
반응형

먼저 세션과 쿠키의 개념을 알아야한다.

 

쿠키란?

  • 쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 데이터파일이다.
  • 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있다.

세션이란?

  • 세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다.
  • 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다.

이로써, 로그인을 구현하기 위해서는 세션이 필요하다. flask에 session 모듈을 import한다.

 

1. View - login.html

클라이언트에서 요청했을 때 보여줘야 하는 페이지를 register.html을 기반으로 생성한다. body부분을 제외하고 동일하므로 body부분만 적겠다.

...
<body>
        <div class="container">
            <div class="row mt-5">
                <h1>로그인</h1>
            </div>
            <div class="row mt-5">
                <div class="col-12">
                    <form method="POST">
                        {{form.csrf_token}}
                        <div class="form-group">
                            {{form.userid.label("아이디")}}
                            {{form.userid(class="form-control", placeholder="아이디")}}
                        </div>
                        <div class="form-group">
                            {{form.password.label("비밀번호")}}
                            {%if form.password.errors%}
                            {{form.password.errors.0}}
                            {%endif%}
                            {{form.password(class="form-control", placeholder="비밀번호")}}
                        </div>
                        </div>
                        <button type="submit" class="btn btn-primary">로그인</button>
                    </form>
                </div>
            </div>
        </div>
    </body>
...

 

2. Control - app.py

/login으로 들어왔을 때 처리해야하는 비즈니스 로직을 작성해보자.

from flask import session
...
@app.route('/login', methods=['GET', 'POST'])
def login():
	form = LoginForm()
    if form.validate_on_submit():
    	print('{}가 로그인 했습니다.'.format(form.data.get('userid')))
        ssession['userid'] = form.data.get('userid')
        return redirect('/')
    return render_template('login.html', form=form)    
    
...

session 변수에 값만 저장해주면 알아서 클라이언트가 구분되고, 세션정보 또한 사용할 수 있다. 굉장히 편하게 세션을 관리할 수 있다.

 

3. form 생성

유효성을 검사하기 위해서 wtf 패키지를 이용할 form을 생성한다.

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()])

 

아이디 : asdf1234

비밀번호 : asdf

비밀번호를 잘못입력함
로그인 성공 시 userid가 나온다.

 

반응형

'PNU DSC > Solution Challenge' 카테고리의 다른 글

Flask 14. 백엔드와 프론트엔드  (0) 2020.03.11
Flask 12. 로그아웃  (0) 2020.03.11
Flask 10. static 파일 관리하기  (0) 2020.03.10
Flask 09. Flask-WTF  (0) 2020.03.10
Flask 08. 회원관리 - Controller  (0) 2020.03.09