不得不说flask的设计要比django要小巧精妙的多了,没有那么臃肿,只保留核心功能,其他的都需要自己引入,即各种各样的插件来满足我们的需求,我这里记录一下自己学习项目中用的插件使用方法和一些技巧总结!

先放一下代码地址: https://gitee.com/houzheng1216/pythonxuexi/tree/master/flask/fristflask

一 flask-cli

falsk内置的脚手架,可代替flask-script管理项目,再也不用写manager.py了

启动项目: 根目录命令: flask run

开启shell:  flask shell

开启一个交互式的python shell,用来访问或处理应用数据。该指令默认激活应用上下文,并导入应用实例。
只有应用实例是默认导入的,如果需要导入其他对象,使用shell_context_processor装饰函数,返回一个字典对象,键值对表示额外导入的对象。

导入:

# 在flask shell 中导入其他对象,导入后shell可以使用
@app.shell_context_processor
def make_shell_context():
return dict(models=models, db=db)

开启之后默认可查看app:

自定义命令:

# 自定义命令,分组命令,使用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中注册命令:

# 添加自定义命令
app.cli.add_command(user_cli)

使用命令,flask 分组名称 命令名称 参数:


二 flask-debugToolbar

这个调试贼好用,简单安装配置使用就完事了

# 配置debugToolbar
toolbar = DebugToolbarExtension()
app.config['SECRET_KEY'] = 'hou'
app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False # 不拦截重定向
toolbar.init_app(app)

使用,页面右边:

这里贴一些常用config配置:

三 flask-WTF

四 falsk-login

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登录之后才能看见后台管理页面:

五 flask-restful

快速构建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-admin

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')

最终效果:

flask插件全家桶集成学习---持续更新ing的更多相关文章

  1. 【转】基于Jenkins实现持续集成【持续更新中】

    知识预览 持续集成 Jenkins安装 Jenkins插件 Jenkins配置 Jenkins备份与恢复 发布PHP项目 SVN 发布Maven项目 按版本发布 远程管理 War文件部署设置 任务 J ...

  2. 基于Jenkins实现持续集成【持续更新中】

    持续集成 1.什么是持续集成:Continuous integration (CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生 ...

  3. MongoDB学习——持续更新

    參考MongoDB权威指南,学习阶段.大家多多交流问题.持续更新本文 MongoDB的长处 MongoDB具有丰富的数据模型,是面向文档的数据库. easy扩展.能够在多台server之间切割数据. ...

  4. FireFox所支持的全部标签(持续更新ing)

    近期研究上各个浏览器的差别,得到一些资料,FireFox眼下所支持的全部标签类型,持续更新,供大家參考和学习,不喜勿喷哦 http://mxr.mozilla.org/seamonkey/source ...

  5. Linux命令(持续更新ing)

    *.命令语法:  a.在进行参数设定时,通常为“-”号,若为完整参数名称,则输入“--”符号;  b.指令太长的时候,可以使用“\”符号使指令连续到下一行;  c.各种符号的意义:    ''     ...

  6. eclipse 好用的插件安装地址集合【持续更新】

    1.PropertiesEditor (编辑properties文件的插件): http://propedit.sourceforge.jp/eclipse/updates/ 2.Aptana Stu ...

  7. Linux学习资料网站汇总链接(持续更新ing)

    排名不分先后. 学海无涯苦作舟. 博客: 1.slmba:LINUX博客原创大牛 2.edsionte's TechBlog:Linuxer (他的友情链接中还有一堆Linuxer,被公司屏蔽进不去. ...

  8. python+mysql+flask创建一个微博应用(持续更新)

    微博应用的结构: 用户管理,包括登录管理,会话,用户角色,个人档案及用户头像. 数据库管理,包括数据库迁移处理. Web表单支持,包括字段检验和用于防止垃圾邮件的验证码功能. 大数据的分页功能. 全文 ...

  9. Flask Ansible自动化平台搭建(持续更新)

    一:简介 使用Ansible + Flask + Celery搭建web平台. 目录结构 . ├── ansible_api │   ├── ansible_playbook_inventory.py ...

随机推荐

  1. 抽象类(abstract class)和接口(interface)有什么区别?

    抽象类中可以有构造器.抽象方法.具体方法.静态方法.各种成员变量,有抽象方法的类一定要被声明为抽象类,而抽象类不一定要有抽象方法,一个类只能继承一个抽象类. 接口中不能有构造器.只能有public修饰 ...

  2. eclipse中部署web项目时报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener的解决方法

    解决方案: 1.右键点击项目--选择Properties,选择Deployment Assembly,在右边点击Add按钮,在弹出的窗口中选择Java Build Path Entries 2.点击N ...

  3. cocos2dx Quaternion 四元数(1/2)

    这篇文章只是我学完四元数之后的一些理解,其实是对别人理解的理解,有些地方我理解但是没有写下来,如果真的想深入的学习四元数,建议从学习复数开始. 这个知识点需要几何想象的天赋和学习的耐心,缺一不可,慢慢 ...

  4. Vue-cli2.0

    本文的学习来自技术胖大神的教程:https://jspang.com/ Vue-cli是vue官方出品的快速构建单页应用的脚手架 开发一个项目,在开始的时候,会构建项目结构.webpack.怎么运行. ...

  5. 【题解】P4755 Beautiful Pair(启发式合并的思路+分治=启发式分治)

    [题解]P4755 Beautiful Pair upd: 之前一个first second烦了,现在AC了 由于之前是直接抄std写的,所以没有什么心得体会,今天自己写写发现 不知道为啥\(90\) ...

  6. 07Shell数组

    Shell 数组变量 普通数组:只能使用整数作为数组索引 关联数组:可以使用字符串作为数组索引 普通数组 定义数组 方法1: 一次赋一个值 数组名[索引]=变量值 示例 # array1[0]=pea ...

  7. 【5min+】 什么?原来C#还有这两个关键字

    系列介绍 简介 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的. ...

  8. 1031 查验身份证 (15 分)C语言

    题目描述 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10 ...

  9. 1046 划拳 (15 分)C语言

    划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输 ...

  10. ipaclient 4.5.4 requires jinja2, which is not installed. rtslib-fb 2.1.63 has requirement pyudev>=0.16.1, but you'll have pyudev 0.15 which is incompatible. ipapython 4.5.4 has requirement dnspython>=