JAVA网络爬虫
HttpClient

导航

 

@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()
    
posted on 2019-08-09 12:15  gmlgxx  阅读(82)  评论(0)    收藏  举报