一,理论介绍
1,Flask是Python编写的轻量级web应用框架,由奥地利帅哥Armin Ronacher于2010年发布
在Github上,Flask热度有51.9k,高于广泛使用的Django的51.8k。
Flask主要由Werkzeug(WSGI工具包)与Jinjia2模板引擎组成,前者负责业务处理,后者负责HTML模板渲染。
Flask拥有的Werkzeug路由系统,完全兼容WSGI标准,WSGI几乎兼容绝大部分web服务器,这样Flask可以运行在大部分的web服务器。
2,Jinjia2模板引擎来源并优于Django模板引擎,支持模板继承,提高代码复用率,对HTML自动转义,避免XSS攻击,对unicode的支持等等。
Flask设计思想,提供一个灵巧方便扩展可以快速开发的应用,不仅能快速开发而且有很强的扩展性,把很多决定权交给开发,根据不同业务需求定制自己的插件库,属于典型的微框架。
3,不像一站式Django包含web应用的几乎所有插件, Flask没有默认数据库, 没有表单验证插件, 这些都交给开发根据自身业务需求扩展。
Flask的扩展丰富,有比较强大的社区, 应用扩展库也能像Flask原生的一样。
灵活也是双刃剑,开发者能自由选择数据库,表单验证等第三方插件,同样相比一站式齐全的框架如Django,需要花费更多时间去选择这些第三方库。
二 ,Jinjia2模板引擎
Werkzeug与Jinjia2是Flask的核心
Werkzeug是WSGI(Web Server Gateway Interface)工具箱,负责功能业务实现,例如路由集成,http事务处理,cookie管理等,可以理解为socket服务,负责http请求底层的实现。
WSGI是Python应用程序或框架与web服务器之间的接口,对web服务器与web应用程序或框架相互配合作出规范。
只要满足WSGI规范,web应用程序可以运行于任何支持WSGI的web服务器,反之亦然。
Jinja2是一个模板引擎
负责HTML模板渲染,支持模板继承,极大地提高了模板复用率;系统运行很快,编译过程会将html代码转换为python字节码,提高运行速度。设计思想来源于django模板引擎,扩展了语法以及沙箱执行,自动转义等强大功能。
以上是Flask的基础介绍,接下来讲下如何开发一个最简单的flask web应用。
三, 实战开始啦
1,首先要准备环境
Python+Flask+Pycharm
直接从python官网下载安装即可。
Pycharm是python IDE,从官网下载即可。
2,Flask安装
在python安装后,通过命令安装flask:pip install flask。
3,Pycharm里新建项目
需要给项目设置系统编译器,否则可能获取不到已经安装的flask包。
选择系统编译器,Package list包含了 flask,jinjia2,后续编写代码,就可以导入flask模块啦。
环境已备好,重点来啦~
编写最简短的Flask应用,如下
my_app = Flask(name)
实例化Flask对象__name__是必填参数,能让flask识别此实例,也可以用其他参数名。
@my_app.route('/')
Python装饰器,将路由与视图函数绑定
访问对应路由,就会调用对应视图函数
一般路由与视图函数一一对应,也可以多个路由映射同一个函数(例如重定向)
a****pp.run(host='127.0.0.1',port=5000, debug='on')
代表flask应用运行于5000端口且只能在本地访问
以上host可以输入 '0.0.0.0', 系统会监听所有外部IP,代表任何host都可以访问此服务
debug模式开启,会自动探测代码的change并重启服务,省掉了手工劳动
看下运行效果
四, 实战-进阶Jinjia2模板
上面属于最简单的例子,实际web开发离不开前端页面编写,前后端参数传递等。
Flask里如何开发前端页面呢?变量如何在前后端关联传递?
常用for循环在Jinjia2模板如何使用等等
下面就一一解答。
Flask里采用了Jinjia2模板,使用模板语法可以快速创建html页面
1,编写前端页面,服务端渲染
新建"templates"文件夹-新增html页面
视图函数里调用 render_template(),html页面作为参数
备注: render_template()默认只接受一个参数,若传递多个,需要给参数指定名称,例如render_template('index.html', hello=res)
HTML页面以及视图函数代码如下
来看看页面效果~
输入框填入内容,点击submit,会触发form表单action,通过action里的url进而触发对应的视图函数city(), 此函数主要接受请求数据,并展示在city.html
小技巧:在py文件里,Ctrl+ 点击模块Flask, 查看Flask对象源码,快速了解构造函数以及代码文件对应默认文件夹名,例如“templates”就是模板的默认文件夹名
2,变量传递以及标签里使用
前端引入服务端变量
要在服务端视图函数里,将变量作为render_template参数返回给模板文件, 就可以引用啦
若需要在页面里展示出来,使用 {{}}引用变量
3, Jinjia2的for语句块
for语句: {% for %} {% endfor %}
4. form表单提交
html页面里使用form标签,通过action属性跳到指定url, url绑定的视图函数也继而触发,这样就可以实现一个页面的交互跳转逻辑啦
不过,值得注意的是form里的input标签,需要指定name属性,这样request才能接受到用户输入的数据
5,模板继承
实际项目里,前端页面一般有公共组件或者样式,可以使用模板继承,提高代码复用率
{% extends "base.html" %}
继承base.html,可以把公用的头部,组件,样式抽离到base.html
{% block body %}
编写页面独有的内容
{% endblock %}
6,不同请求方式设置
装饰器里指定http请求方式
例如 @my_app.route('/', methods=['POST', 'GET'])
顺便说下put请求与post请求区别
Put:向指定URL传送更新资源,幂等
多次重复请求,结果更新到同一个资源
例如更新用户密码,不同密码也只是更新同一个用户
Post:提交请求,用于更新或新建资源,非幂等
例如注册,每次提交就创建新的用户
以上就是Flask的基本介绍,通过简单的flask小应用编写过程更直观的认识flask
Flask远不止能做到这些,目前使用Flask的项目有Uber, LinkedIn
五,Flask的亮点
1 快速搭建,上手容易
2 优秀的Jinjia2模板引擎,从Django模板引擎发展而来,比Django模板使用起来更加自由高效,提供模板继承及自动抗击XSS跨站攻击
3 完全兼容WSGI1.0标准
WSGI是web应用或框架与web服务之间的重要协议,兼容此标准,Flask可以在大多数web服务器上运行
4 基于unicode编码
Flask完全基于Unicode
HTTP本身是基于字节的,任何编码格式都可以在HTTP传输,但是HTTP 要求在Header里显示的声明本次传输所用的编码格式 Flask会自动添加 UTF-8编码格式的HTTP head 程序员无须担心编码问题
5 内置开发调试器
自带的开发服务器,使得调试so easy, 不用安装网络服务器
小编所在部门采用flask制作了图片生成工具,快速生成二维码等, 有类似需求推荐使用,多人协作代码也容易管理。
大家可以关注下我们的公众号, 都是我们部门原创且质量不错的文章