认识轻量级框架Flask 带实战

500 阅读7分钟

一,理论介绍

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制作了图片生成工具,快速生成二维码等, 有类似需求推荐使用,多人协作代码也容易管理。

大家可以关注下我们的公众号, 都是我们部门原创且质量不错的文章