@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()