flask-appbuilder学习笔记-1
1. 开发环境准备
# 创建虚拟环境
virtualenv venv
venv/Script/active
# 安装 flask-appbuilder
pip install flask-appbuilder
# 初始化项目:
flask fab create-app
# 创建管理员
fab create-admin
2.命令行参数整理
fabmanager --help
babel-compile Babel, Compiles all translations
babel-extract Babel, Extracts and updates all messages marked for...
collect-static Copies flask-appbuilder static files to your projects.(收集静态文件)
create-addon Create a Skeleton AddOn (needs internet connection to.)(创建一个插件包)
create-admin Creates an admin user(创建管理员)
create-app Create a Skeleton application (needs internet connection)(创建英语)
create-db Create all your database objects (SQLAlchemy specific).(创建数据库对象)
create-user Create a user(创建用户)
list-users List all users on the database(列出用户)
list-views List all registered views(列出所有视图)
reset-password Resets a user's password(重置密码)
run Runs Flask dev web server.(运行程序)
security-cleanup Cleanup unused permissions from views and roles.
version Flask-AppBuilder package version
3.基础的视图开发
BaseView
- 视图是 FAB 的基本概念,它们就像一个类,代表一个概念并呈现视图和实现它的方法。
- 每个视图都是一个 Flask 蓝图,框架会自动创建。
- 每个视图都可以进行权限的注册
- 所有的视图都继承自BaseView,它的构造函数会在项目中自动注册为蓝图,可以根据需要定义权限
- 可以通过这种视图来实现自定义页面,将其附加到菜单或者从任何点将其链接到站点
- @expose装饰路由方法. (可以看做事定义某个蓝图下的URL)
- @has_access装饰器,标记为安全保护的方法.
Demo:
from flask import render_template
from flask_appbuilder import AppBuilder,BaseView,expose,has_access
from flask_appbuilder.models.sqla import Base
from app import appbuilder
class About(BaseView):
default_view="about"
@expose("/about")
@has_access
def about(self):
return self.render_template("about/index.html")
@expose("/me")
@has_access
def myInfo(self):
return self.render_template("about/me.html")
# 这里如果想要继承系统模板的话,需要使用self.render_template.
appbuilder.add_view(About(),"关于",category="关于")
appbuilder.add_link("反馈",href="/about/me",category="关于")
自定义表单视图
note:
- SimpleFormView或者PublicFormView.
- 有些场景不需要数据库模型的表单,这里支持这样的场景.对于表单,可以写一些自己的处理逻辑.
- 需要定义WTForm字段,并从DynamicForm继承他们.
- form-get,form-post.
- 在form_post方法中,还可以返回None或Flask响应,以程序自己定义模板或重定向用户.
感受: 虽然fab集成了很多功能,但是一些场景,处理起来,其实很麻烦.所以感觉在开发中,应该把flask和fab结合起来.权限管理什么的,交给fab.简单的一些功能,需要特殊定制化的,就交给flask.
Demo:
myform.py
from wtforms import Form,StringField
from wtforms.validators import DataRequired
from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget,BS3TextFieldWidget
from flask_appbuilder.forms import DynamicForm
class PasswordForm(DynamicForm):
appName=StringField(("应用名称"),
description="应用名称",
validators=[DataRequired()],
widget=BS3TextFieldWidget()
)
mePWD=StringField(("记忆密码"),
description="请输入记忆密码",
validators=[DataRequired()],
widget=BS3PasswordFieldWidget()
)
MyView.py
from flask import render_template,flash,redirect,url_for
from flask_appbuilder import AppBuilder,BaseView,expose,has_access
from flask_appbuilder.models.sqla import Base
from flask_appbuilder import SimpleFormView
from app import appbuilder
from .MyForm import PasswordForm
from app import MyForm
class PasswordFormView(SimpleFormView):
form=PasswordForm
form_title="密码生成器"
def form_post(self,form):
appName=form.appName.data
password=form.mePWD.data
newPWD=appName+","+password
return self.render_template("tools/pwd.html",newPWD=newPWD)
appbuilder.add_view(PasswordFormView(),"密码生成",category="工具")
在这里使用的时候,遇到一些困惑.嗯,我不想使用系统自己的这个模式.表单页面让人感觉不能自己定制.查阅了一些资料,其实并没有发现什么有价值的东西.后来在github上找到几个例子.这里便修改了一个自己定义的表单.
视图函数
class PasswordFormView(PublicFormView):
form=PasswordForm
form_title="密码生成器"
@expose("/password",methods=["GET"])
def this_form_get(self):
return self.render_template("tools/myform.html",form=self.form())
# 这里的myform.html是自己写的一个表单视图,这样使得我们可以给页面输入一些自己想要补充得到东西.
@expose("/password",methods=["POST"])
def this_form_post(self):
pform=self.form()
if pform.validate_on_submit():
appName=pform.appName.data
password=pform.mePWD.data
newPWD=appName+","+password
return self.render_template("tools/myform.html",form=self.form(),newPWD=newPWD)
return self.render_template("tools/myform.html",form=self.form())
# 这里有个没有解决的问题,刷新表单页面的时候,会重复提交.
自定义的表单页面
{% extends "appbuilder/base.html" %}
{% block content %}
<h2>密码生成工具</h2>
<hr>
<form method="post" action="/passwordformview/password">
{{ form.csrf_token }}
{{ form.appName.label }} {{ form.appName }}
{{ form.mePWD.label }} {{ form.mePWD }}
<input type="submit" value="点击生成">
</form>
{% if newPWD %}
<h2>生成密码:{{ newPWD }}</h2>
{% endif %}
{% endblock %}
indexView
首页在这里是可以单独指定的..
from flask_appbuilder import IndexView
from flask_appbuilder.security.views import AuthDBView
class MyIndexView(IndexView):
index_template ="index.html"
# 在__init__.py中,配置自己的视图类
# appbuilder = AppBuilder(app, db.session,indexview=MyIndexView,base_template="mybase.html")