본문 바로가기
파이썬

[파이썬] 파이썬 기반 웹 프로그래밍(로그인 환경 구현) / MariaDB 사용

by 딩박사 2021. 6. 10.
반응형

* 본 포스팅은 한국품질재단 취업지원센터에서 주최하는 혁신성장 청년인재 집중 양성사업(인공지능)에서 학습한 내용을 포스팅합니다.


https://kks2140501.tistory.com/6

 

[파이썬] 파이썬(flask)기반 웹 프로그래밍 공부하기 3

* 본 포스팅은 한국품질재단 취업지원센터에서 주최하는 혁신성장 청년인재 집중 양성사업(인공지능)에서 학습한 내용을 포스팅합니다. https://kks2140501.tistory.com/5 [파이썬] 파이썬(flask)기반 웹

kks2140501.tistory.com

※ 심화 과정에 대한 포스팅


목표 : 로그인 환경 구현

 

  •  준비
    • Python
    • Maria DB
    • AdminLTE 3.1.0(로그인 환경 이미지)

https://mariadb.org/download/

 

Download MariaDB Server - MariaDB.org

REST API MariaDB Repositories Release Schedule Reporting Bugs … Continue reading "Download MariaDB Server"

mariadb.org

1. mariadb 다운로드

2. 비밀번호 설정

주의 사항) 설치 시 체크박스 두 개 모두 체크 아니면 원격 접속 불가!!

 

 

 

- mariadb를 사용하여 테이블 생성 및 데이터 입력

 

- 테이블 생성 sql 문

# 테이블 생성
- 회원 테이블
    CREATE TABLE `users_tbl` (
	    `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '내부관리ID',
	    `uid` VARCHAR(64) NOT NULL COMMENT '회원ID' COLLATE 'utf8_general_ci',
	    `upw` VARCHAR(64) NOT NULL COMMENT '회원PW' COLLATE 'utf8_general_ci',
	    `name` VARCHAR(64) NOT NULL COMMENT '회원이름' COLLATE 'utf8_general_ci',
	    `regdate` TIMESTAMP NOT NULL DEFAULT current_timestamp() COMMENT '가입일',
	    PRIMARY KEY (`id`) USING BTREE,
	    UNIQUE INDEX `uid` (`uid`) USING BTREE
    )
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB
    ;


- 회원 가입
INSERT INTO 
    `python_db`.`users_tbl` 
    (`uid`, `upw`, `name`) 
VALUES 
    ('guest', '1', '게스트');

INSERT INTO 
    users_tbl (uid, upw, name) 
VALUES 
    ('guest', '1', '게스트');


- 로그인 처리
SELECT
    * 
FROM 
    users_tbl
WHERE
    uid='guest' 
AND
    upw='1';

 

- mysql을 파이썬에서 사용할 수 있는 라이브러리 PyMySQL사용

https://pypi.org/project/PyMySQL/

 

PyMySQL

Pure Python MySQL Driver

pypi.org

- 접속 후 코드의 일부분만 가져온다

connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             database='db',
                             cursorclass=pymysql.cursors.DictCursor)

 

 

 

- pymysql라이브러리를 사용하여 DB연동

import pymysql as my

def selectUsers(uid, upw):
    row        = None # 쿼리 결과
    connection = None
    try:
        connection = my.connect(host       = 'localhost',
                                user       = 'root',     
                                password   = '1234',     
                                database   = 'python_db',                            
                                cursorclass= my.cursors.DictCursor                       
                                )     
        cursor = connection.cursor()    
        sql    = '''
            SELECT 
                * 
            FROM 
                users_tbl
            WHERE 
                uid=%s
            AND 
                upw=%s;
        '''    
        # 어떤 계정이든 조회가능하게 일반화했다, 확장성을 높였다
        cursor.execute( sql, ( uid, upw ) )    
        row = cursor.fetchone()       
        #print( row )
    except Exception as e:
        print('접속오류', e)
    finally:
        if connection:
            connection.close()
        print('종료')
    # 결과 리턴
    return row

if __name__ == '__main__':
    # 회원 테스트
    row = selectUsers( 'guest', '1' )
    print( '회원조회결과:', row )

    # 비회원 테스트 (회원이 아님, 비번이 틀림, 아이디 틀림)
    row = selectUsers( 'guest', '2' )
    print( '회원조회결과:', row )

# MVC 모델로 웹, M:모델/디비, V:뷰/화면/화면, C:비즈니스로직/커맨드

# 쿼리만 수행하고, 결과만 돌려준다. 그 의미는 판단하지 않는다

# 함수화, 기능 테스트

# 회원이면 dict 형태로 전달(리턴)

# 회원 아니면 None으로 전달(리턴)

 

 

- 로그인 시 회원 판별

from flask import Flask, request, render_template, redirect
from db import selectUsers

app = Flask(__name__)

@app.route('/')
def home():     
    return render_template( 'index.html' )

@app.route('/login', methods=['GET', 'POST'])
def login():     
    if request.method == 'GET':
        return render_template( 'login.html' )
    else:
        uid = request.form.get('uid')
        upw = request.form.get('upw')
        print( uid, upw )
        # 2. 아이디, 비번을 가지고 데이터베이스에 쿼리를 수행 (사전에 이미 가입이 되어 있어야 한다)
        # 3. 수행결과를 받는다
        row = selectUsers( uid, upw )
        if row:
            # 4. 회원이면 => 서비스 페이지 이동 -> 리다이렉트
            return redirect('/')
        else:
            # 5. 회원 아니면 => 아이디 혹은 비번이 틀립니다. => 로그인 화면으로 리턴
            return '''
            <script>
                // 경고창
                alert("로그인 실패. 다시 시도하세요")
                // 이전페이지로 이동
                history.back()
            </script>
            '''
            

if __name__ == '__main__':
    app.run( debug=True )

 

- 모듈 받아오기

  • from 패키지, 패키지... 모듈 import 변수, 함수, 클래스, *
  • from 패키지, 패키지... 패키지 import 변수, 함수, 클래스, *
    • selectUsers()
  • import 패키지, 패키지... 모듈 as 별칭
    • 별칭.selsectUsers()
  • import 패키지, 패키지... 패키지 as 별칭

위의 코드는 from 패키지 import 함수 사용

패키지는 위의 pymysql라이브러리를 사용하여 DB 연동을 가리킨다

 

 

- 여기서 home() 화면은 AdminLTE 3.1.0을 활용하여 로그인 화면을 디자인하였다

https://github.com/ColorlibHQ/AdminLTE/releases

 

Releases · ColorlibHQ/AdminLTE

AdminLTE - Free admin dashboard template based on Bootstrap 4 - ColorlibHQ/AdminLTE

github.com

다운로드한 파일을 넣고 그중에 index.html을 사용

 

 

= URL : http://127.0.0.1:5000/ 의 화면

 

 

 

= 로그인 화면

 

= 틀린 정보 입력 시

- 확인을 누를 시 로그인 화면으로 리턴된다.

 

 

 

= 데이터베이스에 있는 로그인 정보를 올바르게 입력했을 시

- 다시 홈 화면으로 돌아가게 된다.

반응형

댓글