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>