coding

Flask - Blueprint를 통한 Routing 확장

Jeo 2022. 1. 6. 15:36
  • __init__.py
from flask import Flask, render_template
from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect()

def create_app():
    print("run:create_app()")
    app = Flask(__name__)

    # csrf 방어 토큰을 만들기 위해 secret key 필요하고, 이 아이는 flask에서의 secret key 사용할 수 있다고 .
    app.config['SECRET_KEY'] = 'secretkey'

    # 이 조건을 달지 않으면, css같은 사항 변화를 12시간마다 체크한다. 즉 디버깅모드에서는 불편하므로, 디버깅시에는 1초로 변경하는 것.
    if app.config['DEBUG']:
        app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 1

    ''' Routes Init '''
    from gogglekaap.routes import base_route, auth_route
    app.register_blueprint(base_route.bp)
    app.register_blueprint(auth_route.bp)

    ''' CSRF init '''
    csrf.init_app(app)




    @app.errorhandler(404)
    def page_404(error):
        return render_template("404.html"), 404

    return app
  • routes > base_route.py
    from flask import Blueprint, render_template
    
    NAME = "base"
    bp = Blueprint(NAME, __name__)
    
    
    @bp.route('/')
    def index():
        return render_template("index.html")​
     
  • routes > auth_route.py
  • from flask import Blueprint, render_template
    from gogglekaap.forms.auth_form import LoginForm, RegisterForm
    
    
    NAME = "auth"
    bp = Blueprint(NAME, __name__, url_prefix="/auth")
    
    @bp.route('/login', methods=['GET', 'POST'])
    def login():
        form = LoginForm()
        # Request.method = POST 이고, validate OK이면 -- 이라는 뜻
        if form.validate_on_submit():
            # TODO
            # 1. 유저조회
            # 2. 존재하는 유저인지 체크
            # 3. 패스워드 정합 확인
            # 4. 로그인 유지 (세션)
    
            user_id = form.data.get('user_id')
            password = form.data.get('password')
    
            return f"{user_id}, {password}"
        else:
            # TODO :Error
            pass
    
        return render_template(f'{NAME}/login.html', form=form)
    
    
    @bp.route('/logout')
    def logout():
        return 'logout'
    
    
    @bp.route('/register', methods=['GET', 'POST'])
    def register():
        form = RegisterForm()
        if form.validate_on_submit():
            # TODO
            # 1. 유저조회
            # 2. 유저 이미 존재하는지 체크
            # 3. 없으면 유저 생성
            # 4. 로그인 유지 (세션)
    
            user_id = form.data.get('user_id')
            password = form.data.get('password')
            repassword = form.data.get('repassword')
            user_name = form.data.get('user_name')
            return f"{user_id}, {password}, {repassword}, {user_name}"
    
        else:
            # TODO :Error
            pass
    
        return render_template(f'{NAME}register.html', form=form)

폴더 구조

 + templates > auth > login.html

<!--url_for에는 함수명이 들어간다!!-->
<form method="post" action="{{ url_for('auth.login') }}">
    {{ form.csrf_token }}
    {{ form.user_id.label }} {{ form.user_id(minlength=4, maxlength=20) }}
    {{ form.password.label }} {{ form.password(minlength=4, maxlength=20) }}
    {{ form.errors }}
    <input type="submit" value="go">

</form>