2017-11-23 1 views
1

이 질문에 대한 답변 Flask-Admin Role Based Access - Modify access based on role 역할 기반보기를 구현하는 방법, 특히 양식 및 column_lists에 관한 방법을 이해하지 못합니다.Flask-Admin 다른 역할에 대한 다른 양식 및 column_list

말 사용자가 일반 사용자 또는 수퍼 유저 인 경우 MyModelView에 다른 열을 표시하려고합니다. MyModelView에서 is_accessible 재정

정의 (NoneType 오류 AttributeError on current_user.is_authenticated()에 따라)되지 current_user로 중 하나가 작동하지 않는 모든

from flask_security import Security, SQLAlchemyUserDatastore, current_user 

class MyModelView(SafeModelView): 

    # ... 

    def is_accessible(self): 
     if current_user.has_role('superuser'): 
      self.column_list = superuser_colum_list 
      self.form_columns = superuser_form_columns 
     else: 
      self.column_list = user_colum_list 
      self.form_columns = user_form_columns 
     return super(MyModelView, self).is_accessible() 

    # Has same effect as 

    def is_accessible(self): 
     return super(MyModelView, self).is_accessible() 

및 정의 조건부 클래스 속성에 영향을주지 않습니다. 모델 뷰의 __init__ 존재와 동등한에서 같은 일을, current_user 여전히

class MyModelView(SafeModelView): 

    #[stuff] 

    if current_user.has_role('superuser'): 
      column_list = superuser_colum_list 
      form_columns = superuser_form_columns 
    else: 
     column_list = user_colum_list 
     form_columns = user_form_columns 

    #[other stuff] 

참고

을 정의되지 않은, SafeModelView는 앞서 언급 한 문제의 dgBaseView에서 상속하는 모든 클래스가 될 수 있습니다.

+0

current_user가 정의되지 않은 이유는 무엇입니까? flask_login을 사용하지 않습니까? – cal97g

+0

플라스크에 직접 로그인하지 않았습니다. 가져 오기가 업데이트 된 게시물 – ted

+0

current_user가 요청 (https://stackoverflow.com/questions/12710036/attributeerror-on-current-user-is-authenticated) 외부에 존재하지 않습니다. – ted

답변

1

일반적으로 속성으로보기 클래스 속성 (예 : column_list)을 정의합니다.

from flask import has_app_context 
from flask_security import current_user 

class MyModelView(SafeModelView): 
    @property 
    def column_list(self): 
     if has_app_context() and current_user.has_role('superuser'): 
      return superuser_column_list 
     return user_column_list 

    @property 
    def _list_columns(self): 
     return self.get_list_columns() 

    @_list_columns.setter 
    def _list_columns(self, value): 
     pass 

(그리고 is_accessible 기능에 column_list 값 귀하의 재 할당이 더 발효하지 왜)이 방법을 사용하는 데 문제가 많은 뷰 속성은 응용 프로그램 실행에 캐시되어 있고 : 그것은 당신이 그들에게 약간의 동적 로직을 추가 할 수 있습니다 개인 속성에 저장됩니다. column_list은 예를 들어 _list_columns 속성에 캐시되므로 재 정의해야합니다. 이 캐싱이 flask_admin/model/base.py에서 어떻게 작동하는지 확인할 수 있습니다. 당신의 current_user 변수가 아직 의미있는 값이없는 경우 첫 번째 column_list 읽기 응용 프로그램 실행에 발생하기 때문에

플라스크 has_app_context 방법은 여기 필요하다.

form_columns 속성에서도 마찬가지입니다. 속성은 다음과 같습니다.

@property 
def form_columns(self): 
    if has_app_context() and current_user.has_role('superuser'): 
     return superuser_form_columns 
    return user_form_columns 

@property 
def _create_form_class(self): 
    return self.get_create_form() 

@_create_form_class.setter 
def _create_form_class(self, value) 
    pass 

@property 
def _edit_form_class(self): 
    return self.get_edit_form() 

@_edit_form_class.setter 
def _edit_form_class(self, value): 
    pass 
+0

의미가 있으며 내 문제를 해결, 고마워! – ted

관련 문제