不得不说flask的设计要比django要小巧精妙的多了,没有那么臃肿,只保留核心功能,其余的都须要本身引入,即各类各样的插件来知足咱们的需求,我这里记录一下本身学习项目中用的插件使用方法和一些技巧总结!html
先放一下代码地址: https://gitee.com/houzheng1216/pythonxuexi/tree/master/flask/fristflaskpython
falsk内置的脚手架,可代替flask-script管理项目,不再用写manager.py了git
启动项目: 根目录命令: flask runshell
开启shell: flask shelldjango
开启一个交互式的python shell,用来访问或处理应用数据。该指令默认激活应用上下文,并导入应用实例。
只有应用实例是默认导入的,若是须要导入其余对象,使用shell_context_processor装饰函数,返回一个字典对象,键值对表示额外导入的对象。flask
导入:bootstrap
# 在flask shell 中导入其余对象,导入后shell可使用 @app.shell_context_processor def make_shell_context(): return dict(models=models, db=db)
开启以后默承认查看app:api
自定义命令:restful
# 自定义命令,分组命令,使用user管理多个命令 user_cli = AppGroup("user") @user_cli.command("print") # 指定命令 @click.argument("name") # 指定参数 def print_user(name): print("this is", name) @user_cli.command("add") @click.argument("num") def add_num(num): print("result is", num+num)
app中注册命令: cookie
# 添加自定义命令 app.cli.add_command(user_cli)
使用命令,flask 分组名称 命令名称 参数:
这个调试贼好用,简单安装配置使用就完事了
# 配置debugToolbar toolbar = DebugToolbarExtension() app.config['SECRET_KEY'] = 'hou' app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False # 不拦截重定向 toolbar.init_app(app)
使用,页面右边:
这里贴一些经常使用config配置:
Flask-Login 为 Flask 提供用户 session 的管理机制。它能够处理 Login、Logout 和 session 等服务。
将用户的 id 储存在 session 中,方便用于 Login/Logout 等流程。
让你可以约束用户 Login/Logout 的视图
提供 remember me 功能
保护 cookies 不被篡改,这个能够和flask-admin一块儿使用,很方便,适合简单轻量级的需求
不过新出了更强大的权限框架Pycasbin
定义User模型:
''' flask-login user类必须实现如下: is_authenticated 是否属性 is_active 是否激活属性 is_anonymous 是否匿名属性 get_id() 方法, 能够继承UserMixin,提供了默认实现 ''' class User(db.Model, UserMixin): __tablename__ = 'user' # 表名 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) password = db.Column(db.String(50)) age = db.Column(db.Integer) write_time = db.Column(db.DateTime, default=datetime.now()) # toString方法 def __repr__(self): return '<User %r>' % self.name
配置:
# 配置flask-login login_manager = LoginManager() login_manager.login_view = 'myuser.login' # 指定跳转登陆函数,权限拦截时跳转 login_manager.login_message_category = 'info' login_manager.login_message = '请先登陆' login_manager.init_app(app) # 配置回调函数,必须配置 # user session 记录的是用户 ID (user_id),回调函数的做用就是经过 user_id 返回对应的 User 对象 @login_manager.user_loader def load_user(user_id): print(user_id) # 登陆成功的时候会自动获取主键id return models.User.query.filter_by(id=user_id).first()
登陆登出方法:
@user.route('/login/', methods=['GET', 'POST']) def login(): form = LoginForm() # 实例化form对象 if request.method == "POST" and form.validate_on_submit(): username = request.form.get('username') password = request.form.get('password') user = User.query.filter_by(name=username, password=password).first() if user: # 将用户信息注册到flask-login中 login_user(user) return redirect(url_for('myuser.get_all_user')) else: flash("请从新输入用户名和密码") return render_template('login.html', form=form) @user.route('/logout/', methods=['GET', 'POST']) @login_required # 装饰器,必须登陆才能有权限 def logout(): logout_user() return redirect(url_for('myuser.get_all_user'))
权限控制:
使用@login_required 注解拦截函数
和admin一块儿使用,拦截后台数据管理页面,不会admin的能够先看flask-admin:
class MyModelView(ModelView): can_delete = True can_create = False # 是否能建立 # Override displayed fields column_list = ('name', 'age') # 显示的属性 # 重写方法实现权限控制 def is_accessible(self): print(current_user.name) # 获取login的当前用户 if current_user.is_authenticated and current_user.name == "Tom": return True return False # 访问页面没有权限时回调函数,可跳转登陆 def inaccessible_callback(self, name, **kwargs): # redirect to login page if user doesn't have access return redirect(url_for('myuser.login', next=request.url))
这样只有Tom登陆以后才能看见后台管理页面:
快速构建restApi,仍是很方便的,其实就是把一个url的增伤改查写到一个类里面:
新建api类:
# restful 构建api from models import User, db # 返回格式 resource_fields = { 'id': fields.Integer, 'name': fields.String, 'age': fields.String, 'write_time': fields.String } class RestUser(Resource): # 格式化返回结果,envelope 数据显示名字 @marshal_with(resource_fields, envelope="user") def get(self, id): return User.query.filter_by(id=id).first(), 200 def post(self, name): # 解析参数 parser = reqparse.RequestParser() # 添加参数,校验等,help: 校验不经过时展现自定义信息, location 可指定参数解析位置 parser.add_argument('age', type=int, required=True, help='年龄必须是整数,且不为空', location='form', dest='age_alis') # dest 使用别名存储参数,原来参数名key没法获取 args = parser.parse_args() # age = request.form.get('age') user = User(name=name, age=args['age_alis']) db.session.add(user) db.session.commit() # 继承父类参数 parser_copy = parser.copy() # 覆盖或者删除 parser_copy.replace_argument('age', type=int, required=True) parser_copy.remove_argument('age') return "success" def delete(self, id): user = User.query.filter_by(id=id).first() db.session.add(user) return "ok"
配置:
mail.init_app(app) # 注册restful api api = Api(app) api.add_resource(RestUser, '/rest/<int:id>', '/rest/<name>') # 可以使用多个url访问接口
Flask提供了一个扩展模块帮助咱们快速搭建一个后台管理系统,这个模块就是--Flask-Admin
这个能够提供全部model数据的增删改查,并且很是灵活支持扩展,好比禁用删除,只显示某一列等等:
配置:
# 继承ModelView,实现一些自定义扩展 from models import User class MyModelView(ModelView):
# 这里能够定制权限管理 can_delete = True can_create = False # 是否能建立 # Override displayed fields column_list = ('name', 'age') # 显示的属性 # 重写方法实现权限控制 def is_accessible(self): print(current_user.name) # 获取login的当前用户 if current_user.is_authenticated and current_user.name == "Tom": return True return False # 访问页面没有权限时回调函数,可跳转登陆 def inaccessible_callback(self, name, **kwargs): # redirect to login page if user doesn't have access return redirect(url_for('myuser.login', next=request.url))
# 初始化admin后台管理 admin = Admin(app, name='MyWebSite', template_mode='bootstrap3') # 注册模型用来管理,可自定义url,避免冲突(此处也使用蓝图,名字默认使用model的小写名字,名字不能与蓝图名字冲突) admin.add_view(MyModelView(models.User, db.session, name=u'用户管理', url='user/manage')) admin.add_view(UserView(name='自定义视图'))
定制视图(把某些页面放在后台管理上):
# 继承BaseView进行视图页面定制 class UserView(BaseView): # 使用expose进行路由,每一个视图必须有一个 '/' 函数,不然报错 @expose('/') def index(self): return self.render('boot.html') @expose('/user_manager') def user_manager(self): return self.render('boot.html')
最终效果: