Flask框架及其应用

Flask介绍对于Flask大家很熟悉了,现在主流Python的web框架,除了Django就数Flask了 。
Django不用多说,集合了orm、template模板引擎、后台管理系统、参数验证、路由系统、用户认证和其他一些工具的,方便快速建站,主要构建了ORM和复写ADMIN模块,就可以快速生成网站和后台增上改查和一些其他的定制化开发 。
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手 。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现 。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站 。
笔者更倾向于Flask这个框架,因为它更加透明,更能掌控项目的质量 。
使用过的插件Flask的插件管理是一个很不错的特性,我们利用它可以在启动web服务之前加载我们所需要的插件,一下是笔者经常用到的:

  • flask-restful
flask的restapi开发框架,有参数校验,路由拦截等功能 。
  • flask-sqlalchemy
Sqlalchemy的flask插件,这个插件作者扩展了针对与session中的query的分页功能,可以使用SQLALCHEMY_BINDS进行多个数据库的绑定,可以配置连接池,连接池过期时间 。
  • MySQLclient或者pymysql
Sqlalchemy连接mysql的引擎,不过pymysql需要加入一句话:
import pymysqlpymysql.install_as_MySQLdb()
  • marshmallow
Sqlalcemy序列化数据利器,可以使用它针对query返回的QuerySet结果集合进行序列化成dict 数据 。
  • flask-cors
开发API会遇到跨域访问的问题,可以就是客户端OPTIONS的请求,先探知服务器允不允许跨域访问,允许会返回header中允许那些方法进行请求服务器(GET、POST、DELETE、PUT等),这个插件可以通过简单的配置,让您的服务允许跨域访问,不过在生产环境,还是推荐使用Nginx的好,能够使用lua语言进行更加严格的控制 。
  • flask-login或者flask-jwt-extended
这两个都是用户认证用到的插件,使用session控制,选择flask-login,使用jwt使用flask-jwt-extended 。
Flask框架下面简单说一下flask的框架,flask框架是基于Werkzeug和Jinja2两大基础框架,Werkzeug是基于WSGI协议的框架,已经有了基本的路由、数据结构、请求和响应等功能,在此之上Flask扩展了一些特性:
  • request
Flask利用Werkzeug的Local、LocalStack和LocalProxy,实现了AppContext和RequestContext的线程或者协程安全功能,也就是:
  1. 当请求过来,Flask将app_context和request,这两个对象压入一个线程号或者协程号对应的栈中,说白了就是dict字典,线程或者携程号有get_indent内置方法获得
  2. 请求过程中,由栈弹出上次压入栈中的app_context和request
  3. 请求结束释放空间
【Flask框架及其应用】另外说明flask-sqlalchemy利用线程或者携程号有get_indent,可以使用scope_session功能,将session隔离,它是线程或者协程安全的,也和flask的请求保持一致 。
  • endpoint
使得每个view方法,有个名称,这个名称是唯一的,它能够通过这个名称找到这个视图方法,也就能够获得路由 。
这里数据结构简单地说就是一个map类型,一个名称唯一对应一个视图方法,不允许相同的endpoint出现,这个应用在使用url_for这个方法上:
  1. 程序中使用url_for进行路由跳转
  2. template模板总是用url_for查找对应的路由
这样可以灵活根据名称去使用路由,而不是硬编码到程序中非常死板,如果说我们修改了一个url的地址,只是微小的修改,其他引用这个路由的地方也需要修改,我们可能忘记了使用它的地方,这时url_for非常好的解决了这个问题 。
  • extentions
扩展应用,提供了两种方式,一种是直接加载,之类用生成对象例如CORS(flask_app),也可以懒加载,在创建应用之前定义对象,创建flask_app时加载插件,例如flask-sqlalchemy
from flask import Flaskfrom flask_sqlalcemy import Sqlalchemydb = Sqlalchemy()def create_app():"""创建Flask app"""f_app = Flask()f_app.config.from_object("core.settings")db.init_app(app=f_app)return f_app这样的形式,我们可以使用全局这个db对象了 。
开发项目目录结构我们可以借鉴django的目录形式进行组织项目的框架,例如:


推荐阅读