@manager.command的使用

命令介绍

  • 在python中使用Flask框架开发项目时,会用到Flask_script扩展包来管理程序,可以使其在终端中使用指令操作程序。
  • manager的作用:在终端可以使用指令来操作程序
  • command装饰后的作用:自定义命令
  • 使用场景:创建一些敏感数据(如后台管理员),批量添加测试数据等等…
  • 终端中操作指令 : python 文件名 方法名

简单案例

  • 在终端添加用户
python manage.py create_role
  • models.py
from exts import db
from datetime import datetime
# generate_password_hash生成密码(就是加密),    check_password_hash解释密码(就是解密)
from werkzeug.security import generate_password_hash, check_password_hash


class CMSPersmission(object):
    # 255的二进制表示方法 1111 1111
    ALL_PERMISSION = 0b11111111
    # 1. 访问者权限
    VISITOR =        0b00000001
    # 2. 管理帖子权限
    POSTER =         0b00000010
    # 3. 管理评论权限
    COMMENTER =      0b00000100
    # 4. 管理板块权限
    BOARDER =        0b00001000
    # 5. 管理前台用户权限
    FRONTUSER =      0b00010000
    # 6. 管理后台用户权限
    CMSUSER =        0b00100000
    # 7. 管理后台管理员的权限
    ADMINER =        0b01000000


# 建立多对多的表 这是关联表  不是模型  但是也会存在数据库中
cms_role_user = db.Table(
    # 关联表的表名
    "cms_role_user",
    # "cms_role_id"取得字段名  类型int      外键用的id(表名(我们跟表名去了报了名的__tablename__).id)  主键
    db.Column("cms_role_id", db.Integer, db.ForeignKey("cms_role.id"), primary_key=True),
    db.Column("cms_user_id", db.Integer, db.ForeignKey("cms_user.id"), primary_key=True)
)


class CMSRole(db.Model):
    __tablename__ = "cms_role"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), nullable=False)
    desc = db.Column(db.String(200), nullable=True)
    create_time = db.Column(db.DateTime, default=datetime.now)
    # 权限, 把角色权限默认为访问者权限
    permissions = db.Column(db.Integer,  default=CMSPersmission.VISITOR)

    # 关联表就是一张简单的表,不是模型,所以注意写法
    #
    # 多对多关系可以在任意一侧定义关系,这里是在CMSRole表里定义
    #
    # secondary参数为关联表名
    #
    # backref会自动处理另一侧的反向引用,所以你看CMSUser表那么简洁
    users = db.relationship("CMSUser", secondary=cms_role_user, backref="roles")


class CMSUser(db.Model):
    __tablename__ = "cms_user"
    # db.Column表示是数据库真实存在的字段, primary_key表示为主键, autoincrement表示自动增长, 每次加1
    # Integer是整形
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # String字符串 长度50个字符
    # nullable	如果为True,允许有空值,如果为False,不允许有空值
    username = db.Column(db.String(50), nullable=False)
    _password = db.Column(db.String(100), nullable=False)
    # unique 如果为True,代表这列不允许出现重复的值
    email = db.Column(db.String(50), nullable=False, unique=True)
    join_time = db.Column(db.DateTime, default=datetime.now)

    def __init__(self, username, password, email):
        self.username = username
        # 执行setter方法
        self.password = password
        self.email = email

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, raw_password):
        # 密码加密
        self._password = generate_password_hash(raw_password)

    def check_password(self, raw_password):
        # 解密                        加密后的密码       原始密码
        result = check_password_hash(self.password, raw_password)
        return result
  • manage.py
from flask_script import Manager
from flask_migrate import MigrateCommand, Migrate

from zlbbs import create_app
from exts import db
# 导入以后他会把这个models所有的表都会印刷到数据库当中
from apps.cms import models as cms_models

# 把cms_models下的CMSUser这个表类, 赋值给CMSUser
CMSUser = cms_models.CMSUser
CMSRole = cms_models.CMSRole
CMSPersmission = cms_models.CMSPersmission

# 创建flask里app
app = create_app()

# 创建数据库迁移工具对象的步足有3步
# 1. 创建flask脚本管理工具对象
manager = Manager(app)

# 2. 创建数据库迁移工具对象
Migrate(app, db)

# 3. 向manager对象中添加数据库的操作命令
# 第一个参数是给这条命令取的名字叫什么,关于数据库的我们通常叫db
# 第二个参数就是具体的命令
manager.add_command("db", MigrateCommand)


# 创建管理员  --manager的作用: 是在终端使用命令, option的作用:装饰的之后,可以传递参数
@manager.option("-u", "--username", dest="username")
@manager.option("-p", "--password", dest="password")
@manager.option("-e", "--email", dest="email")
def create_cms_user(username, password, email):
    """创建管理员用户"""
    user = CMSUser(username=username, password=password, email=email)
    # 添加
    db.session.add(user)
    try:
        # 提交到数据库
        db.session.commit()
        print("cms 用户添加成功")
    except Exception as e:
        print(e)
        db.session.rollback()
        print("cms 用户添加失败")


# @manager.add_command 这是一个函数
@manager.command # 添加自定命令create_role  终端运行 python manage.py create_role
def create_role():
    # 1. 访问者(可以修改个人信息)
    visitor = CMSRole(name="访问者", desc="只能相关数据, 不能修改.")
    visitor.permissions = CMSPersmission.VISITOR

    # 2. 运营角色(修改个人信息, 管理帖子, 管理评论, 管理前台用户)
    operator = CMSRole(name="运营", desc="管理帖子, 管理评论, 管理里前台用户, 管理后台用户权限.")
    operator.permissions = CMSPersmission.VISITOR | CMSPersmission.POSTER | \
                           CMSPersmission.COMMENTER | CMSPersmission.FRONTUSER | \
                           CMSPersmission.CMSUSER

    # 3. 管理员(拥有大部分权限)
    admin = CMSRole(name="管理员", desc="拥有本系统所有权限.")
    admin.permissions = CMSPersmission.VISITOR | CMSPersmission.POSTER | \
                        CMSPersmission.CMSUSER | CMSPersmission.COMMENTER | \
                        CMSPersmission.FRONTUSER | CMSPersmission.BOARDER

    # 4. 开发者权限(管理后台管理员)
    developer = CMSRole(name="开发者", desc="开发人员专用角色.")
    developer.permissions = CMSPersmission.ADMINER

	# 添加的数据
    db.session.add_all([visitor, operator, admin, developer])

    try:
    	# 提交到数据库
        db.session.commit()
        print("添加成功")
    except Exception as e:
    	# 回滚到提交前
        db.session.rollback()
        print("添加失败")


if __name__ == "__main__":
    manager.run()