본문 바로가기

flask 로그인 기능 구현(db x)

by ris 2024. 3. 27.

flask로 로그인 구현을 해보겠습니다.

DB는 없습니다.

 

from flask import Flask, render_template, session, redirect, request, flash
from markupsafe import escape
import pymysql

app = Flask(__name__)
app.secret_key = 'secret_key'

users = {}

@app.route('/')
def index():
    if 'username' in session:
        return render_template('index.html')
    else:
        return redirect('/register')


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username in users and users[username] == password:
            session['username'] = username
            return render_template('index.html')
    return render_template('login.html')

@app.route('/register', methods=['GET','POST'])
def register():
    if 'username' in session:
        return redirect('/')
    if request.method == 'POST':
        reg_username = request.form['reg_username']
        reg_password = request.form['reg_password']
        if reg_username in users:
            flash("That id is already exist. try again")
            return redirect('/register')
        elif reg_username == "" or reg_password == "":
            flash("Please input id")
            return redirect('/register')
        else:
            users[reg_username] = reg_password
            return redirect('/login')
    return render_template('register.html')

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect('/')

@app.route('/leave', methods=['GET','POST'])
def leave():
    if request.method == 'POST':
        del_username = request.form['del_username']
        del_password = request.form['del_password']
        if del_username in users and users[del_username] == del_password:
            session.pop('username', None)
            del users[del_username]
            return redirect('/')
        else:
            return render_template('leave.html')
    else:
        return render_template('leave.html')


if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8080) # debug는 ctrl + c 하지 않아도 새로고침만 하면 적용이 됨

 

html들은 그저 input 태그랑 form, submit 정도라 생략했습니다.

 

우선 설명드리겠습니다.

 

from flask import Flask, render_template, session, redirect, request, flash
from markupsafe import escape
import pymysql

 

이 부분은 라이브러리 불러오기입니다.

flask란 라이브러리에서 여러가지를 불러온 것입니다.

escape는 문자열 관련 라이브러리입니다.

pymysql은 db 관련 라이브러리인데 여기서는 쓰지 않습니다.

 

app = Flask(__name__)
app.secret_key = 'secret_key'

users = {}

 

첫 줄은 Flask 앱을 실행하는 코드입니다.

secret_key는 필수로 해야합니다.

이유는 단순합니다.

저 secret_key는 세션과 쿠키에 대해 암호화를 하기 때문입니다.

 

다음 users는 DB 대용입니다.

저 안에 딕셔너리 형태로 값을 넣으시면 됩니다.

 

@app.route('/')
def index():
    if 'username' in session:
        return render_template('index.html')
    else:
        return redirect('/register')

 

index 코드입니다.

저 username은 세션 속에 있는지 확인하는 것이고 의미는 로그인 유무입니다. *loggedin 이라고 하는 것이 일반적입니다.

render_template으로 html파일을 불러왔고 redirect로 창을 이동했습니다.

주의할 점 : 이 코드는 예전 코드라 몰라서 redirect를 썼지만 저렇게 redirect를 남용하면 후에 리디렉션이 과도해져 문제가 생길 수 있습니다. render_template으로 html을 불러오는 것이 가장 좋습니다.

 

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username in users and users[username] == password:
            session['username'] = username
            return render_template('index.html')
    return render_template('login.html')

 

@app.route 는 app이 flask를 연 앱의 객체이기에 즉 flask의 url을 설정하는 것입니다.

methods는 get 방식과 post 방식으로 소통한다는 뜻이고 아래 post 방식일 때만 html에서 form 형태로 온 정보를 request.form으로 받는다는 의미입니다.

그리고 만일 id와 password가 users 내에 있는 정보와 같다면 로그인 세션 부여 이후 index로 돌아갑니다.

틀릴 시에는 다시 로그인 페이지를 로드합니다.

 

@app.route('/register', methods=['GET','POST'])
def register():
    if 'username' in session:
        return redirect('/')
    if request.method == 'POST':
        reg_username = request.form['reg_username']
        reg_password = request.form['reg_password']
        if reg_username in users:
            flash("That id is already exist. try again")
            return redirect('/register')
        elif reg_username == "" or reg_password == "":
            flash("Please input id")
            return redirect('/register')
        else:
            users[reg_username] = reg_password
            return redirect('/login')
    return render_template('register.html')

 

회원가입 페이지입니다.

회원가입은 로그인 상태에서 못하게 하기 위해 저렇게 해놓았고 여기도 html에서 form 형태로 온 정보만 받기 위해 methods를 post로 해놓았고 받은 정보에서 이미 있는 아이디는 중복 처리로 취소해주고 다시 리디렉션했습니다.

아무것도 없다면 페이지를 리로드했습니다.

주의할 점:저 공백은 띄어쓰기만 해도 우회할 수 있기에 전 귀찮아서 안했지만 split이나 다른 방식으로 공백을 아예 없엔 후에 검사하면 띄어쓰기만 있는 것도 막을 수 있습니다.

 

이후는 그냥 딕셔너리에 넣는 것입니다.

 

@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect('/')

@app.route('/leave', methods=['GET','POST'])
def leave():
    if request.method == 'POST':
        del_username = request.form['del_username']
        del_password = request.form['del_password']
        if del_username in users and users[del_username] == del_password:
            session.pop('username', None)
            del users[del_username]
            return redirect('/')
        else:
            return render_template('leave.html')
    else:
        return render_template('leave.html')

 

짧은 페이지라 그냥 한번에 해보겠습니다.

logout 페이지는 그냥 session을 빼서 logout하고 다시 home으로 돌아가는 코드입니다.

이렇게되면 자동으로 /register 페이지로 가겠지요.

물론 바로 register 페이지로 가는 것이 편합니다.

이 코드가 예전 코드라 참고하고 보시길 바랍니다.

 

leave 페이지는 logout과 다르게 users 딕셔너리에서 값을 없에는 방식입니다.

post 방식일때만 하고 id와 password가 같다면 제거, 아니면 다시 리로드하는 방식입니다.

 

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8080) # debug는 ctrl + c 하지 않아도 새로고침만 하면 적용이 됨

 

드디어 마지막입니다.

이 py 파일이 main일 경우(여러 개의 파일이 있을 수 있기에 구별을 위해 한 것임) app을 호스팅하는 것입니다.

debug=True는 실시간으로 저장한 값을 굳이 ctrl+c하지 않고 바로 적용되게 한다는 것이고 port=8080은 포트 설정입니다.

host는 ip를 설정하는 곳인데 host='0.0.0.0' 은 외부에서 들어올 수 있도록 ip를 개방한다는 의미입니다.

즉 한정된 ip가 아닌 모든 public ip를 제한없이 받는다는 의미죠.

'' 카테고리의 다른 글

Window 10/11에서 Apache + php8 연동하는 법 (직접 설치)  (3) 2024.05.15
flask로 웹 만들기 2 (+Mysql)  (0) 2024.04.04
flask로 웹 만들기  (0) 2024.03.16