플라스크 (Flask) - 회원가입 기능 만들기 (MVC 패턴 )

*Flask 회원가입기능 만들기

 

 

*구조 (Structure)

Flask폴더
│   ├── templates (폴더)
│          ├── register.html                                    
│          

├── app.py (실행파일)                                           
├── db.sqlite (이건 자동으로 생성됨)
├── models.py                  

 

* app.py                                  

from flask import Flask, render_template, request, redirect #render_template으로 html파일 렌더링
from models import db
import os
from models import Fcuser
app = Flask(__name__)

@app.route('/')
def hello():
    return render_template("hello.html")
#GET = 페이지가 나오도록 요청. POST = 버튼을 눌렀을때 데이터를 가지고오는 요청/ 요청정보확인하려면 request 임포트 필요
@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(password) # 들어오나 확인해볼 수 있다. 


        if not (userid and username and password and re_password) :
            return "모두 입력해주세요"
        elif password != re_password:
            return "비밀번호를 확인해주세요"
        else: #모두 입력이 정상적으로 되었다면 밑에명령실행(DB에 입력됨)
            fcuser = Fcuser()         
            fcuser.password = password           #models의 FCuser 클래스를 이용해 db에 입력한다.
            fcuser.userid = userid
            fcuser.username = username      
            db.session.add(fcuser)
            db.session.commit()
            return "회원가입 완료"

        return redirect('/')

if __name__ == "__main__":
    basedir = os.path.abspath(os.path.dirname(__file__))  # database 경로를 절대경로로 설정함
    dbfile = os.path.join(basedir, 'db.sqlite') # 데이터베이스 이름과 경로
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + dbfile
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True     # 사용자에게 원하는 정보를 전달완료했을때가 TEARDOWN, 그 순간마다 COMMIT을 하도록 한다.라는 설정
    #여러가지 쌓아져있던 동작들을 Commit을 해주어야 데이터베이스에 반영됨. 이러한 단위들은 트렌젝션이라고함.
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False   # True하면 warrnig메시지 유발, 

    db.init_app(app) #초기화 후 db.app에 app으로 명시적으로 넣어줌
    db.app = app
    db.create_all()   # 이 명령이 있어야 생성됨. DB가


    app.run(host='127.0.0.1', port=5000, debug=True) 

return render_template('xxxx.html') - template 폴더 안의 html파일을 렌더링합니다. 

@app.route('/register', methods=['GET','POST']) - GET 와 POST 두가지 메서드를 허용합니다.

허용하지 않으면 아래 그림처럼 Method Not Allowed 메시지가 발생합니다.

 

 

 추가로 POST, GET은 둘다 정보를 서버로 전달하기위한 기능입니다.

차이점은 GET : 저장된 정보를 단순히 요청할때 사용되며, url에 정보의 이름이 노출됩니다. 

POST : url에 쿼리가 노출되지 않으며, 요청시 데이터 양에 제한이 없습니다.

 

POST는 한마디로 데이터에 수정이 있는경우 (게시글 작성, 회원가입 정보 받기)

GET은 단순히 정보를 보기위한 용도? (게시글 읽기, 회원가입창 보기)

*register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" 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" >
                <div class="form-group">
                    <label for="userid">아이디</label>
                    <input type="text" class="form-control" id="userid" placeholder="아이디" name="userid"/>
                    <!-- id는 삭제해도 되더라. 마지막에 name과 app.py의 get 메소드 사용하는 부분이 일치해야 상응한다 -->
                </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>
</body>
</html>

form은 부트스트랩(bootstrap)을 이용했습니다.

<form method="POST" >: input을 감싸는 태그에 메소드를 표시해줘야 합니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

<input type="text" class="form-control" id="userid" placeholder="아이디" name="userid"/>

 

 

*Models.py (데이터 베이스)

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()           #SQLAlchemy를 사용해 데이터베이스 저장

class Fcuser(db.Model): 
    __tablename__ = 'fcuser'   #테이블 이름 : fcuser
    id = db.Column(db.Integer, primary_key = True)   #id를 프라이머리키로 설정
    password = db.Column(db.String(64))     #패스워드를 받아올 문자열길이 
    userid = db.Column(db.String(32))       #이하 위와 동일
    username = db.Column(db.String(8))

 여기까지 만들고 app.py를 파이썬상에서 실행시키면

 

 

다운로드.png

여기까지하면 완성입니다. 아이디, 이름, 비밀번호를 입력한 후, 제출버튼을 누르면 db.sqlite 데이터베이스에 입력됩니다.

*DB로 잘 넘어가는지 확인하기

 

 

(비밀번호는 input type='password' 라서 동그라미로 표시되었으나, 1234로 입력하였습니다.)

제출을 누른뒤 db.sqlite를 열어보겠습니다.

 

 

 

잘 들어간 모습입니다.

[출처] https://infinitt.tistory.com/m/30

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
44 [python] 크롤링한 데이터 DB에 저장하기 file 졸리운_곰 2021.01.29 3215
43 [python] 크롤러 만들어 db에 정보 insert 하기 졸리운_곰 2021.01.29 356
42 Python - mongoDB 다루기 졸리운_곰 2020.12.05 345
41 XML to JSON ( JSON to XML ) 파이썬 스크립트 변환 졸리운_곰 2020.10.04 365
40 [python] 크롤러 만들어 db에 정보 insert 하기 졸리운_곰 2020.10.02 525
39 python 으로 pdf 에서 text 문자열 추출 (뽑아내기) file 졸리운_곰 2020.09.05 1001
38 [파이썬] sqlite3 모듈 사용법 졸리운_곰 2020.05.06 510
37 Python 데이터 시각화 file 졸리운_곰 2020.05.06 587
36 파이썬 SQLite3 사용법 file 졸리운_곰 2020.05.06 450
35 How to create an SQLite3 database in Python 3 졸리운_곰 2020.04.30 40569
34 Python - Linked Lists 졸리운_곰 2020.03.25 439
33 python으로 GUID 만들기 졸리운_곰 2019.02.27 545
32 파이썬으로 구현한 기본적인 블록체인 : A Practical Introduction to Blockchain with Python file 졸리운_곰 2019.02.22 1078
31 파이썬-sql알케미-tutorial, sqlalchemy tutorial file 졸리운_곰 2018.08.27 524
30 node.js python-shell을 활용하여 python 실행 file 졸리운_곰 2018.08.14 689
29 Python, PyV8로 javascript 실행하기 file 졸리운_곰 2018.08.14 623
28 Does Python SciPy need BLAS? 졸리운_곰 2018.05.26 487
27 [파이썬으로 구현한 알고리즘] (7) 트리(Tree) file 졸리운_곰 2018.02.27 1957
26 [파이썬으로 구현한 알고리즘] (6) 쉘 정렬(Shell Sort) file 졸리운_곰 2018.02.27 771
25 [파이썬으로 구현한 알고리즘] (5) 삽입 정렬(Insertion Sort) file 졸리운_곰 2018.02.27 1033
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED