# 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是貼程式碼就能直接跑的範例,後面的自行整合。

```
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鍵

```
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. 導入資料庫跟調整
假設已經有資料庫了

```
# 自訂類名稱 繼承預設模組
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