フラスコ管理者

良い時間です。



最近取り組んでいるプロジェクトFlask-Adminを紹介します。 一言で言えば、これはFlaskフレームワークの拡張機能であり、これによりDjangoスタイルの管理インターフェイスをすばやく作成できます。



建築



すべての仕組みと、Django管理パネルとの違いについて説明します。



Flask-Adminのベースブリックは、 ビューメソッドを持つクラスです。 レンガから管理者を作成し、メニューを描画する基本的なコードが少しあります。 それだけです



このアプローチは、管理インターフェースをどのように効果的に構築しますか?



たとえば、典型的なタスク-モデルのCRUDを考えてみましょう。



「額」にすることができます-入力時にモデルのリストを取得するコードを記述し、それぞれを表示するフォームとプレートを作成します。 このコードはモノリシックであり、特定のタイプのORMで動作し、一般に拡張が困難です。



また、1つのモデルで機能するクラスを作成できます。 このようなクラスのインスタンスを作成し、それを管理パネルに接続すると、このモデルの制御インターフェイスが取得されます。 残りのモデルについて繰り返し、管理パネルの準備がほぼ整います。



さらに、このアプローチを使用すると、機能を簡単に拡張できます。 モンキーパッチの代わりに、必要なメソッドを再定義するだけで十分であり、その結果、新しい動作が得られます。



これは、Djangoとの主な違いです。特定のタスクの管理機能を迅速かつ簡単に拡張または置換できます。



フラスコ管理者



Flask-Adminがすぐにできること:

1.アクセスルールを考慮した接続されたブリックからのメニュー生成(最大2レベル)

2.使用される認可システムに関する仮定なしでアクセスを制御する機能

3.独自の「ブリック」を作成するための基本クラスのセット

3.ページング、ソート、フィルター、検索などを含むSQLAlchemyモデルの CRUD。

4. ファイルマネージャー

5.ローカリゼーション。 Flask-Babelの修正バージョンを使用して動作します。パッチはArminに送信されましたが、まだ受け入れられていません。 リポジトリからバージョンを一時的にインストールできます。PyPIの現在の安定版と下位互換性があります。



クライアント側は、 Twitter Bootstrapの上で実行されます。 理由は非常に単純です-適切な外観とUIをすばやく作成するためのUIの束。 何らかの方法で、管理パネルは通常のユーザーには通常アクセスできず、ブートストラップを使用したUIの作成は、それを使用しない場合よりもさらに便利です。



この例のモデルのリストは次のとおりです。





そして、ここに組み込みのファイルマネージャがあります:





コードにより近い



したがって、管理パネルをアプリケーションに接続するには、次のものが必要です。

1. Adminクラスのインスタンスを作成します

2. BaseViewクラスのインスタンスを追加します(すべての「ブリック」はそれから継承されます)



たとえば、ユーザーと投稿の2つのモデルがあります。管理パネルを作成する必要があります。 初期化コードは次のようになります。

from flask.ext.admin import Admin from flask.ext.admin.contrib.sqlamodel import ModelView admin = Admin(app) admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Post, db.session))
      
      





db.session錬金術セッションです。



ModelViewは、Djangoのイメージと外観を拡張します。クラス/インスタンスレベルで変更可能なプロパティのセットがあります。



たとえば、ユーザーモデルのリストからパスワードフィールドを除外する必要がある場合は、次のようにします。

 class MyUserAdmin(ModelView): excluded_list_columns = ('password',) admin = Admin(app) admin.add_view(MyUserAdmin(User, db.session))
      
      







祖先を呼び出す前に、コンストラクターのプロパティを変更することを妨げるものはありません。

 class MyUserAdmin(ModelView): def __init__(self, session, name, excluded=None): if excluded: self.excluded_list_columns = excluded super(MyUserAdmin, self).__init__(User, session, name=name) admin = Admin(app) admin.add_view(MyUserAdmin(db.session, 'View1', ('password',)) admin.add_view(MyUserAdmin(db.session, 'View2', ('email','password'))
      
      







必要に応じて、テンプレートに別の「ビュー」とボタンを追加できます。クリックすると、テンプレートが表示されます。

 from flask.ext.admin import expose class MyUserAdmin(ModelView): #     list_template = 'myproject/admin/userlist.html' @expose('/report/<int:id>/') def report(self, id): #   return self.render('myproject/admin/userreport.html', id=id) def __init__(self, session): super(MyUserAdmin, self).__init__(User, session) admin = Admin(app) admin.add_view(MyUserAdmin(db.session))
      
      







「通常の」外観を得るには、テンプレートの「admin / master.html」から継承する必要があります。

 {% extends 'admin/master.html' %} {% block body %} Hello World from MyView! {% endblock %}
      
      





テンプレートとビューメソッドの動作は、Flaskの標準的なものと完全に類似しています。



機能拡張



機能の拡張は、2つの部分に分けることができます。

1.組み込みの「バッテリー」の動作を変更する

2.新しい何かを書く



電池


構造的に、足場モデルは2つの層で構成されます。

1.データへのアクセスレベル。 モデルのイントロスペクションからデータアクセスメソッドまで、特定のORM実装との相互作用のロジックがあります。

2. UIのレベルと残りのロジック



(継承を介して)両方のレベルを組み合わせると、特定のORM用の既製の「バッテリー」が得られます。 たとえば、mongo-alchemyをサポートする必要があります。ロジックを記述し、基本クラスから継承し、mongoのCRUDを取得します。



ModelViewは、クラス(またはコンストラクターで規定されている場合はインスタンス)のプロパティを使用してそれ自体を構成できます。 ただし、十分な既製の設定オプションがない場合は、いつでも継承して必要なメソッドを再定義し、まったく異なる動作を取得できます。



ファイルマネージャも同様に機能します。 たとえば、ユーザーMikeのレポートディレクトリへのアクセスを拒否する場合は、次のようなことができます。

 class MyFileAdmin(FileAdmin): def is_accessible_path(self, path): if path.startswith('reports'): return user.login != 'mike' return True
      
      







新機能


次に、完全に新しい機能を追加します。 これは、新しい「ブリック」が追加される方法です。

 from flask.ext.admin import Admin, BaseView, expose class MyView(BaseView): @expose('/') def index(self): return self.render('myproject/admin/index.html') admin = Admin(app) admin.add_view(MyView(name='Hello'))
      
      







メニューにアイテムが表示され、「Hello」アイテムを開くと、インデックスビューが呼び出されます。 次のようになります。





ビュー間のリンクを生成するには、ビュー名の先頭にドットを付けた通常のurl_forを使用できます。



 from flask import url_for class MyView(BaseView): @expose('/') def index(self): url = url_for('.help') return self.render('myproject/admin/index.html', url=url) @expose('/help/') def help(self): return self.render('myproject/admin/help.html', id=id)
      
      







さらなる開発は、Flaskで通常のコードを書くことと変わりません。



合計



現在、ライブラリAPIは多かれ少なかれ安定しており、いくつかのプロジェクトで正常に使用されています。



例はこちらです: github.com/mrjoes/flask-admin/tree/master/examples

ドキュメントはこちら: flask-admin.readthedocs.org/en/latest



そして、いつものように、パッチはいつでも歓迎です。



All Articles