Python/Python Flask

Flask-Admin으로 관리 페이지 만들기

임베디드 친구 2025. 9. 15. 19:55
728x90
반응형

Flask-Admin으로 관리 페이지 만들기

Flask는 가볍고 확장 가능한 웹 프레임워크로, 다양한 확장을 통해 기본 기능 외에도 강력한 기능을 쉽게 추가할 수 있습니다. 그중 Flask-Admin은 어드민 인터페이스를 간단하게 구현할 수 있도록 도와주는 매우 유용한 확장입니다. 이번 포스팅에서는 Flask-Admin을 사용해 관리 페이지를 만드는 방법을 단계별로 살펴보겠습니다.

Flask-Admin 설치하기

Flask-Admin을 사용하려면 먼저 해당 확장을 설치해야 합니다. 아래 명령어를 사용해 설치할 수 있습니다:

pip install flask-admin

간단한 Flask 애플리케이션 설정

먼저 Flask 애플리케이션을 초기화하고 기본 설정을 추가합니다. 데이터베이스를 사용해 데이터를 관리하기 위해 Flask-SQLAlchemy를 함께 사용할 것입니다.

애플리케이션 초기화

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SECRET_KEY'] = 'mysecret'
db = SQLAlchemy(app)

# Flask-Admin 초기화
admin = Admin(app, name='My Admin', template_mode='bootstrap4')

데이터 모델 생성하기

관리 페이지에서 관리할 데이터 모델을 생성합니다. 예를 들어, 사용자(User) 모델을 생성해보겠습니다.

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<User {self.name}>'

Flask-Admin에 모델 등록하기

생성한 데이터 모델을 Flask-Admin에 등록하여 관리할 수 있도록 설정합니다. 이를 위해 ModelView를 사용합니다.

# User 모델을 관리 페이지에 추가
admin.add_view(ModelView(User, db.session))

데이터베이스 초기화 및 실행

다음으로 데이터베이스를 초기화하고 Flask 애플리케이션을 실행합니다.

if __name__ == '__main__':
    # 데이터베이스 생성
    db.create_all()

    # 애플리케이션 실행
    app.run(debug=True)

Flask-Admin 인터페이스 확인하기

위 코드를 실행한 후 웹 브라우저에서 http://127.0.0.1:5000/admin에 접속하면 Flask-Admin 관리 페이지에 접속할 수 있습니다. 기본적으로 Flask-Admin은 Bootstrap 기반의 깔끔한 UI를 제공합니다.

Flask-Admin 커스터마이징

Flask-Admin은 기본 제공되는 관리 페이지 외에도 다양한 방식으로 커스터마이징할 수 있습니다. 예를 들어, 특정 필드만 표시하거나 정렬 순서를 설정할 수 있습니다.

필드 표시 설정

class UserAdmin(ModelView):
    column_list = ('id', 'name', 'email')
    column_searchable_list = ('name', 'email')
    column_filters = ('name',)

# 커스터마이징된 UserAdmin 추가
admin.add_view(UserAdmin(User, db.session))

인증 및 권한 추가하기

관리 페이지에 인증 및 권한을 추가하여 보안을 강화할 수도 있습니다. Flask-Login과 같은 확장을 함께 사용하면 간단히 구현할 수 있습니다.

인증 예제

from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user

login_manager = LoginManager(app)
login_manager.login_view = 'login'

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(100), nullable=False)

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

# ModelView에 접근 권한 추가
class SecureModelView(ModelView):
    def is_accessible(self):
        return current_user.is_authenticated

admin.add_view(SecureModelView(User, db.session))

마무리

Flask-Admin은 어드민 인터페이스를 쉽고 빠르게 구축할 수 있는 강력한 도구입니다. 이번 포스팅에서는 기본적인 설정과 함께 데이터 모델 관리, 커스터마이징, 인증 추가 방법을 살펴보았습니다. Flask-Admin을 활용해 더욱 효율적이고 세련된 관리 페이지를 구현해보세요!

전체 코드

아래는 위에서 설명한 내용을 모두 포함한 최종 코드입니다:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from flask_login import LoginManager, UserMixin, current_user

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SECRET_KEY'] = 'mysecret'

db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(100), nullable=False)

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

class SecureModelView(ModelView):
    def is_accessible(self):
        return current_user.is_authenticated

admin = Admin(app, name='My Admin', template_mode='bootstrap4')
admin.add_view(SecureModelView(User, db.session))

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)
반응형