八年经验月薪三万为什么要来马哥
程序人生

一线Python运维开发带你秒懂Flask框架

  Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

  今天我们邀请到了多年从事Python开发的不动老师,让他为我们带来flask开发的一线实战。

  不动:马哥教育Python实战开发讲师团特邀讲师,多年python开发经验,重度flask使用者,当前从事 O2Oweb商城后端开发和运维开发的工作。

  Flask是微型web框架,框架本身十分精简,微型并不代表其功能弱,核心代码基于Werkzeug, Jinja 2 这两个库,它以插件形式的进行功能扩展,且插件易于安装与使用,并且可以自行开发扩展插件

  了解其基本结构后,可以迅速进行MVC开发,或者将其当作后端restfulApi来响应数据。

  虚拟环境,将当前运行环境完全与系统的python环境进行隔离,这里我们使用pyenv这个库来进行构建环境

  为何需要使用虚拟环境? 因为虚拟环境对于每一个python环境来说是独立开来的,用虚拟环境可以在一台机器上运行多个项目时,每个项目的环境是隔离,不产生依赖。

  4、如需其他版本也可以下载对应的版本放到~/.pyenv/cache文件夹下面(cache文件夹假如不存在,自行创建)

  6、安装2.7.12版本成功后,创建一个目录为完全隔离的python虚拟环境:

  Wsgi是python中定义的一种网关协议规范,pep333对此的相关解释:

  wsgiref包是实现了wsgi标准的一个参考,我们可以用它来进行调试,此包一般用于测试环境,不建议生产环境中使用。

  simple_server实现了一个简易的http服务器,我们可以用它来运行一个wsgi应用

  下面示例我们可以用wsgiref这个包实现一个简单的wsgi web框架来理解其工作流程:

  上面的代码中,我们使用了wsgiref包简易的实现了一个wsgiweb框架,其中我们依据传入的env中获取到url后缀来匹配router字典中对应的处理函数

  Env参数是包含了客户端请求的信息和服务端的环境信息,可以将其打印出来,看下其中包含的变量。

  在上述中可以看出,wsgi的作用是在web服务器和web应用之间的桥梁,web服务器监听将客户端请求转发给实现wsgi规范接口处理,wsgi接将请求进行中转给上层的web应用处理,web应用处理完成并生成响应返回给wsgi接口,然后web服务器将收到的响应返回给客户端。

  Flask框架也是依据上面的规范实现的web框架,我们可以看下flask源码中对于上述的封装,不过它做了更高层次的抽象

  一个http过程中请求来自客户端,http服务器(nginx,Apache)再次将请求转发给flask应用实例app,@app.route(‘/)中映射了url链接与一个python函数的对应关系,我们将index函数称之为视图函数。

  在一般业务中,url都是动态可变的,在flask中我们这样设置可变url

  被尖括号抱起来的部分代表url中与python处理函数中对应的可变部分.

  将自定义转换器加入到app应用url_map中,当客户端输入参数时,可以以,我们自行设置的分隔符做转换

  在生产环境中客户端到服务端,使用python开发应用的一般流程是如下图所示:

  request请求对象是flask内部封装的一个全局对象,这个对象是线程隔离的,必须运行在当前请求中的上下文,直接运行会报错,它通过werkzeug模块中localproxy在localstack这种数据结构寻找当前请求

  在fig对象中保存了flask的默认配置以及我们项目中写入的配置变量,通常情况下flask中的一些配置如下

  上面两种都可以将配置文件加入到app应用当中,其中app.config.from_object()方法会寻找配置文件为类的配置

  用函数封装配置文件写入app,这样可以依据参数来区分开发环境与生产环境的配置文件。

  什么是工厂方法?工厂方法是一种设计模式,这里使用可以简单理解为通过一个函数来批量创建一个flask app对象,依据不同的参数来生成不同的app

  当需要运行app的时候,可以通过工厂方法传递参数来生成不同的app对象,方便的进行测试不同的app,并且生成多个app的时候可以进行分别进行请求处理,流量负载等,通过以下示例说明

  flask中钩子函数作用是将被装饰的函数注册到app当中,在不同阶段执行。

  app.errorhandler:接受状态码,并且自定义返回错误处理信息页面

  蓝图将应用进行模块化,能够很方便的将不同的功能和路由区分开,并且易于维护,蓝图基于相同的url前缀来作区分。

  功能类似的视图函数组合在一起作为蓝图的组件,将应用进行分割,极大简化了大型应用的复杂度,蓝图要注册到app对象中,蓝图的使用方式与app的使用方式很像

  将user这些相似的功能分成一个蓝图模块,注意蓝图文件不能和蓝图对象同名,否则会冲突报错

  v当以上user实例化时,必须将此注册到app应用中,蓝图才能生效,url_prefix为自定义添加的url后缀

  v由于db对象需要读取app应用中配置,并且依赖app上下文工作,所以将上述db对象等扩展插件初始化app,在每次app启动之前完成绑定

  使用上述db对象,model字段继承db.Model,在mvc中此表示model层,用来进行数据库表字段映射关联以及数据写入保存等.

  使用flask可以轻松开发应用,每一种web框架都有其自身利弊,对于现代web开发的需求来说,微框架很适合快速迭代式开发,最好的理解的方法是实践,可以依据以上对flask有一个大体理解之后进行一个简单的应用开发。