Flask编程入门(一)基本介绍

一、Flask框架简介

Flask诞生于2010年,作者是Armin Ronacher,本来这个项⽬只是作者在愚⼈节的⼀个玩笑,后来由于⾮常受欢迎,进⽽成为⼀个正式的项目。它是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

二、组成部分

Flask框架由以下几个主要组件所构成,在安装Flask时会自动作为依赖项安装:

  1. Werkzeug:内置的WSGI实现,主要用于开发调试,在Windows平台上功能有所限制;
  2. Jinja:默认的模板引擎,用于渲染动态生成的页面,目前使用的版本是Jinja2;
  3. MarkupSafe:配合Jinja2模板引擎的安全组件,用于过滤不受信任的输入以防止注入攻击;
  4. ItsDangerous:配合Flask的数据安全组件,用于签名数据并确保完整性,如Session Cookie;
  5. Click:用于编写命令行应用的框架,提供标准的Flask命令行,并允许添加自定义管理命令;
  6. Blinker:用于提供对信号(Signals)功能的支持。

此外,Flask框架中还提供了两个可选的依赖项,但是如果安装了则会被Flask自动检测并调用:

  1. python-dotenv:提供从.env中加载环境变量到Python应用中,用于安全灵活的指定敏感信息;
  2. Watchdog:看门狗程序,用于在开发调试阶段监控代码更改并自动重载项目。

三、工作模式

Flask的基本模式为在程序里将一个视图函数分配给一个URL,每当用户访问这个URL时,系统就会执行给该URL分配好的视图函数,获取函数的返回值并将其显示到浏览器上,其工作过程如下图所示。

其中WSGI是Web Server Gateway Interface的缩写,中文名为“Web服务器网关接口”。最初WSGI是为Python语言定义的Web服务器(如Apache和Nginx等)和Web应用程序或框架之间(如Flask和Django等)的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。实际上,WSGI更类似于一种标准或协议,其行为在PEP 333中定义,很多Web应用程序或框架都实现了该协议。

一套完整的WSGI实现可以分为两个部分:一部分是“服务器”(也被称为“网关”),另一部分为“应用程序”或“应用框架”。在处理一个WSGI请求时,WSGI服务器会为Web应用程序提供环境信息及一个回调函数(Callback Function)。当应用程序完成处理请求后,透过前述的回调函数,将结果回传给Web服务器。根据上述特性不难看出,WSGI属于一种中间件,在Web服务器和Web应用程序之间起沟通协调的作用:从Web服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。一个比较常见的WSGI实现是uWSGI,适用于在Nginx和Python Web应用程序。

WSGI服务器主要有以下几种功能:

  • 重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象;
  • 允许在一个进程中同时运行多个应用程序或应用框架;
  • 负载均衡和远程处理,通过在网络上转发请求和响应消息;
  • 进行内容后处理,例如应用XSLT样式表。

当用于调试时也可以不部署WSGI服务器,通过在Flask APP启动命令中设置debug参数调用Flask框架内置的Web服务器,但是由于内置服务器性能较弱,不适用于高并发的生产环境,因此强烈建议只在开发调试环境中使用,Web应用正式上线后应通过WSGI服务器对外提供服务。

四、优势和特点

Flask有如下一些优点:

  1. 采用“微框架”的开发模式,简洁灵活,只做它需要做的事情;
  2. 扩展性很好,包含开发服务器和调试器、集成支持单元测试、支持RESTful请求调度,因此相关的开源扩展插件也很多;
  3. 拥有灵活的Jinja2模板引擎,提高了前端代码的复用率。这样可以提高开发效率,有利于后期开发与维护;
  4. 官方文档完整,便于学习掌握。

Jinja2模板引擎的主要作用是根据Python代码(模板渲染函数)传入的的变量,结合指定的模板,动态生成要返回的网页内容,既可以是供用户访问的页面,也可以是供其他网站或应用使用的接口(也就是通常所说的API)。

例如,使⽤Flask开发Web应用程序的过程中,需要进行数据库操作的时候,具体是使⽤SQLAlchemy还是MongoEngine,选择权完全掌握在你⾃⼰的⼿中。区别于Django,Django内置了⾮常完善和丰富的功能,但是如果你想将框架中原有的功能实现替换成自己想要的,要么无法实现,要么很多时候⾮常麻烦。

接下来将从最简单的Hello, Flask!代码开始,逐步介绍Flask的各项功能,并结合目前正在开发的开源DEMO项目进行演示和讲解。

相关推荐