-
Flask Project - MyBlog Flask-admin(관리자 페이지 생성 및 관리)프로젝트 2024. 4. 8. 22:25반응형
Flask에서는 관리자 페이지를 생성해주는 flask-admin 라이브러리가 존재합니다. 해당 라이브러리를 활용해 관리자 페이지를 생성하고 관리해보겠습니다.
1. 관리자 페이지 생성 + 관련 환경 변수 관리(config.py)
# blog/__init__.py from flask_admin import Admin from blog.admin_models import get_all_admin_models from .models import db def create_app(config): ''' 이전 코드 생략 ''' # admin 페이지에 모델뷰 추가 admin = Admin(app, name='MyBlog', template_mode='bootstrap3') for admin_model, model in get_all_admin_models(): admin.add_view(admin_model(model, db.session)) # blog/config.py class Config(): ''' 이전 코드 생략 ''' FLASK_ADMIN_SWATCH = 'Darkly' # 테마 설정
2. admin에 추가할 모델뷰 + 폼 클래스(FlaskForm) 설정
admin에 등록한 모델뷰와 모델(DB 스키마)을 기반으로 페이지를 생성해줍니다. 모델을 기반으로 form도 생성해주지만, 관리자용 form과 일반 유저 form을 다르게 설정하기 위해 공통 SignUpForm을 정의했습니다. 그리고 관리자용 form은 권한 관련 필드를 추가하여 정의하였습니다.
이제 일반 유저용 SignUpForm에는 username, email, password, password_check 4개의 필드가 존재하고,
관리자용 form은 추가적으로 2개의 권한 필드가 존재합니다.
# blog/admin_models.py from flask import abort from flask_admin.contrib.sqla import ModelView from flask_login import current_user from werkzeug.security import generate_password_hash from wtforms import BooleanField from blog.forms import SignUpForm def admin_check(current_user): if current_user.is_authenticated == True and current_user.admin_check == True: return True else: return abort(403) class UserAdmin(ModelView): # 1. 접근 권한 확인 def is_accessible(self): return admin_check(current_user=current_user) # 2. 폼 데이터 설정 form = type('ExtendedSignUpForm', (SignUpForm,), { 'post_create_permission': BooleanField('post_create_permission', default=False), 'admin_check': BooleanField('admin_check', default=False) }) # 3. 사용자가 패스워드를 입력하고 저장할 때 해시화하여 저장하는 로직 추가 def on_model_change(self, form, model, is_created): model.password = generate_password_hash(form.password.data) super().on_model_change(form, model, is_created) # 4. 표시 X 열 설정 column_exclude_list = {'password'} def get_all_admin_models(): return [[UserAdmin, get_model('user')], ... 추가되면 설명]
# blog/forms.py from flask_wtf import FlaskForm from wtforms import StringField, EmailField, PasswordField, from wtforms.validators import DataRequired, Email, Length, EqualTo class SignUpForm(FlaskForm): username = StringField('username', validators=[DataRequired(), Length(3,30)]) email = EmailField('email', validators=[DataRequired(), Email()]) password = PasswordField('password', validators=[DataRequired(), Length(6, 30), EqualTo("password_check", message="Password must match...")]) password_check = PasswordField('password_check', validators=[DataRequired()])
비밀번호 암호화 부분에서 generate_password_hash는 sha256 방식으로 암호화를 진행하는데, 암호화 관련해서 아래글 참고해주세요. 메소드형태로 바로 사용가능하기 때문에 generate_password_hash를 사용했지만, 좀 더 강력한 보안을 원하시면 bcrypt를 사용하는걸 권장합니다.
- bcrypt vs sha256: https://velog.io/@kylexid/왜-bcrypt-암호화-방식이-추천되어질까
왜 Password hashing시 Bcrypt 가 추천되어질까?
정확히는 bcrypt가 정답은 아닙니다. 일반적으로 공격자는 GPU를 이용하여 빠른 연산속도로 암호화 공격 시도를 합니다. 어떤 암호화 함수(sha-2, bcrypt, pbkdf2, scrypt, ..)를 쓰던 강력하지만, 충분한 시
velog.io
3. 결과 확인
localhost:[PORT번호]/admin/User 사진 create form edit form
간단하게 admin 페이지를 생성하고 모델(DB 스키마)에서 표시하지 않을 column을 선택하고, form도 새롭게 정의하는 등, admin 페이지를 customizing해봤습니다.
반응형'프로젝트' 카테고리의 다른 글
Flask Project - MyBlog views(post 생성,수정,삭제) with unittest (0) 2024.04.11 Flask Project - MyBlog auth(회원가입, 로그인, 로그아웃) with unittest (1) 2024.04.09 Flask Project - MyBlog Flask-sqlalchemy(with Flask-migrate) DB 관리 (0) 2024.04.08 Flask Project - MyBlog 프로젝트 목적, 아키텍쳐, Config, gitignore 관리 (3) 2024.04.08 SWeetMe Project - 회원가입, 로그인 기능 (1) 2024.03.18