# Flask-admin後台 ###### tags: `散裝flask技術` ## 前言 <2023.2.13> 有一點基礎的話應該會看得懂...吧 實務上初始化阿、類阿、資料庫阿之類的看架構會放到不同的地方,不會都放在一起。 算是個人筆記,主要是參考文章+自己的理解說明,後面有新內容會再更新。 環境為windows + vscode ## 基礎 安裝 ``` pip install flask-admin ``` 基本框架用法 ``` from flask_admin import Admin from flask_admin.contrib.sqla import ModelView # 初始化後台 admin = Admin(app) # 新增欄位 類名稱 資料表 admin.add_view(ModelView(User, db.session)) # ModelView是預設類 ``` 默認進入的路徑 ``` http://127.0.0.1:5000/admin/ ``` ## 開始應用與自訂內容 ### 1. 沒有資料庫的自訂網頁 只有1是貼程式碼就能直接跑的範例,後面的自行整合。 ![](https://i.imgur.com/prtos4W.png) ``` from flask import Flask,render_template from flask_admin import Admin, expose, BaseView app = Flask(__name__) # 初始化後台 admin = Admin(app, name='後台名稱') # 自訂類 繼承預設類 class adminindex(BaseView): @expose('/') # 用法等於路由 def index(self): return render_template('firstadmin.html') # 導入自己的網頁 # 增加欄位 自訂類 欄位名稱 admin.add_view(adminindex(name='後台第一欄')) if __name__ == "__main__": app.run() ``` ### 2. 自訂後台名稱跟修改Home鍵 ![](https://i.imgur.com/L2vphKn.png) ``` admin = Admin(app, name='後台名稱', template_mode='bootstrap3',index_view=AdminIndexView( name='導覽', template='welcome.html', url='/admin') ) # name調整左上角的後台名稱 # template_mode調整導覽列的樣式 # 那個Home是預設有的回後台首頁,可以自己調整 # index_view=AdminIndexView調整Home的功能 # (name調整名稱、template放導向哪個html、url是進入這個後台的路由,默認是/admin) ``` ### 3. 導入資料庫跟調整 假設已經有資料庫了 ![](https://i.imgur.com/IESTYR6.png) ``` # 自訂類名稱 繼承預設模組 class first(ModelView): # 關掉後台操作的創建資料功能,要新增就需要另外接 can_create = False # 資料表欄位對應中文 column_labels = { 'mb_id':u'編號', 'mb_title':u'標題', 'mb_username' : u'留言人', 'mb_message':u'留言內容', 'mb_data':u'留言時間' } # 指定要顯示在後台的資料庫內容,預設是全部 # 如果已經有上面的轉中文column_list可以拿掉 column_list = ('mb_id','mb_title', 'mb_username','mb_message','mb_data') # 設定輸入參數 self、資料庫、在導覽列顯示的字 def __init__(self, session, **kwargs): super(first, self).__init__(message_board, session, **kwargs) # message_board是資料表的名稱,放自己的就好 # 資料表就在這邊定好了,另外兩個參數使用類時再放 # 新增導覽列的欄位,名字叫留言板 admin.add_view(first(db.session ,name=u'留言板')) ``` 備註: db.session的db變數是在設定資料庫的時候自訂的,常規都設db,一開始設定的時候要叫什麼都可以自己決定。 ### 4. 進入後台的權限設定 簡易版,拿上面的類做範例 ``` class first(ModelView): # 判斷函式 def is_accessible(self): # 目前連線的使用者是否有登入 且 登入的使用者名稱是否為admin(自己調整) if current_user.is_authenticated and current_user.username == "admin": return True return False column_labels = { 'mb_id':u'編號', 'mb_title':u'標題', 'mb_username' : u'留言人', 'mb_message':u'留言內容', 'mb_data':u'留言時間' } def __init__(self, session, **kwargs): super(first, self).__init__(message_board, session, **kwargs) # 同上 class adminindex(BaseView): def is_accessible(self): if current_user.is_authenticated and current_user.username == "admin": return True return False @expose('/') def index(self): return render_template('firstadmin.html') ``` ## 參考 1. ModelView官方檔案 https://flask-admin.readthedocs.io/en/latest/_modules/flask_admin/model/base/#BaseModelView.get_filter_arg 2. ModelView參數中文意思 https://www.cnblogs.com/feifeifeisir/p/12858412.html 3. 參考文章 https://www.cnblogs.com/feifeifeisir/p/12858367.html