728x90

flask-admin을 사용할때, 특정 그룹의 사용자 ( admin? ) 가 아니면 admin 페이지에 접근 못하게 막고 싶을 수 있다.

(아니 대부분의 경우 막아야 한다!)

그럴때 사용하면 된다.

class MyAdminIndexView(AdminIndexView):
    def is_accessible(self):
      #블라블라 허용된 그룹의 사용자인지 판별 
      # session['id'] 가져와서 판별 등등.
      return False

admin = Admin(app, name='flask', template_mode='bootstrap3', index_view = MyAdminIndexView())

바로 is_accessible() 메소드를 오버라이드 하여 막으면 된다.

admin 페이지 접근이 막힌 모습

 

근데 이 코드는 문제가 있다. 딱 index 페이지만 막힌 모습이다. model 별 url을 입력하면 통과해서 확인 가능하다.

testtable 페이지가 바로 확인 가능한 모습

이럴때는 ModelView를 추가할때, 동일하게 is_accessible() 메소드를 오버라이드 해주면 처리할 수 있다.

class MyModelView(ModelView):
  def is_accessible(self):
      #블라블라 허용된 그룹의 사용자인지 판별 
      # session['id'] 가져와서 판별 등등.
      return False

  column_display_pk = True

  def __init__(self, cls, session, **kwargs):
    super(MyModelView, self).__init__(cls, session, **kwargs)

admin = Admin(app, name='flask', template_mode='bootstrap3', index_view = MyAdminIndexView())
admin.add_view(MyModelView(TestTable, db.session))

 

이는 is_accessible() 메소드가 다음과 같은 class diagram에서 최상위 클래스인 'BaseView'에 있기 때문이다.

flask-admin의 view 클래스 구조

그래서 Index용과 그 외 ModelView용 페이지 인가 제어 ( 이 부분도 일반화되어 교체 가능하게 해도 되고 )

ModelView 클래스를 만들고, 모든 model view 만들때 상속시켜주면 이제 진짜 인가된 사용자 그룹만

허용 시킬 수 있게 된다. 

728x90

'프로그래밍 > Python' 카테고리의 다른 글

flask-admin 에서 pk, fk 등이 보이지 않고, 수정, 추가 안될때 해결 방법  (0) 2023.05.01
lof  (0) 2019.08.26
ball tree  (0) 2019.08.01
kd tree  (1) 2019.07.04
keras를 활용한 다중선형회귀분석  (2) 2019.05.30
728x90

1. column_list,  form_columns 를 수정하는 방법

 

String타입의 pk를 가지는 TestTable 이라는 테이블을 만들었다고 치자.

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

class TestTable(db.Model):
    __tablename__ = 'test'

    id = db.Column(db.String, primary_key=True)
    test_string = db.Column(db.String)

admin = Admin(app, name='flask', template_mode='bootstrap3')
admin.add_view(ModelView(TestTable, db.session))


@app.route('/', methods=['GET', 'POST'])
def index():
  return 'hi'

위 코드를 실행하여, flask-admin 페이지로 들어가면 다음과 같다. (임의로 row 하나 넣어둠)

flask-admin 페이지 모습

근데 보면 pk인 id가 보이지 않는다. Create 탭을 들어가도, 막상 데이터를 추가하고자 하면,

추가에 실패한다.

이럴때는 CustomModelView를 만들어서 column_list, form_columns 필드를 수정해주면 해결된다.

class MyModelView(ModelView):
  column_list = ()
  form_columns = ()

  def __init__(self, cls, session, **kwargs):
    MyModelView.column_list = [ c_attr.key for c_attr in db.inspect(cls).mapper.column_attrs ]
    MyModelView.form_columns = [ c_attr.key for c_attr in db.inspect(cls).mapper.column_attrs ]
    super(MyModelView, self).__init__(cls, session, **kwargs)

admin = Admin(app, name='flask', template_mode='bootstrap3')
admin.add_view(MyModelView(TestTable, db.session))

위 코드에서는 model class의 column 을 다 돌면서 추가해주었다. 이렇게 하여 실행하면 잘 나오는 것을 확인할 수 있다.

pk가 잘 나오는 모습
Create에도 이제 id가 잘 노출 된다


2. column_display_pk 를 수정하는 방법

 

이 방법은 create는 안되지만, ( 뭐, form_columns만 따로 채워주면 되긴 한다 ) 볼 수는 있는 방법이다.

class MyModelView(ModelView):
  column_display_pk = True

  def __init__(self, cls, session, **kwargs):
    super(MyModelView, self).__init__(cls, session, **kwargs)

역시 잘 나온다.

이 방법은 Id 부분에도 클릭하여 ordering이 가능하다.

728x90

'프로그래밍 > Python' 카테고리의 다른 글

flask-admin에서 ModelView 페이지 접근 막는 법  (0) 2023.05.01
lof  (0) 2019.08.26
ball tree  (0) 2019.08.01
kd tree  (1) 2019.07.04
keras를 활용한 다중선형회귀분석  (2) 2019.05.30

+ Recent posts