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")
posted @ 2021-09-19 22:00  人人从众  阅读(1251)  评论(0编辑  收藏  举报