Flask框架学习

  • Flask简介
  • Flask程序执行过程
  • HelloWorld示例
  • WEB应用开发中的关键路径
  • 蓝图
  • 什么是蓝图
  • 蓝图的运行机制
  • 蓝图的使用
  • 一、创建蓝图对象。
  • 二、注册蓝图路由。
  • 三、在程序实例中注册该蓝图。
  • 四、项目中实践

Flask简介

Flask是轻量级的服务端Web框架,附带了发布网页的最低要求。通过定制第三方扩展来实现具体功能如数据库,表单控件等。可定制性,通过扩展增加其功能,这是Flask最重要的特点。Flask的两个主要核心应用是Werkzeug和模板引擎Jinja。

Flask程序执行过程

所有Flask程序必须有一个程序实例。
Flask调用视图函数后,会将视图函数的返回值作为响应的内容,返回给客户端。一般情况下,响应内容主要是字符串和状态码。

当客户端想要获取资源时,一般会通过浏览器发起HTTP请求。此时,Web服务器使用WSGI(Web Server Gateway Interface)协议,把来自客户端的所有请求都交给Flask程序实例。WSGI是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口,它封装了接受HTTP请求、解析HTTP请求、发送HTTP,响应等等的这些底层的代码和操作,使开发者可以高效的编写Web应用。

程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)。根据每个URL请求,找到具体的视图函数。 在Flask程序中,路由的实现一般是通过程序实例的route装饰器实现。route装饰器内部会调用add_url_route()方法实现路由注册。

调用视图函数,获取响应数据后,把数据传入HTML模板文件中,模板引擎负责渲染响应数据,然后由Flask返回响应数据给浏览器,最后浏览器处理返回的结果显示给客户端。

HelloWorld示例

新建文件hello.py:

#导入Flask类
from flask import Flask

#Flask类接收一个参数__name__
app = Flask(__name__)

#装饰器的作用是将路由映射到视图函数index
@app.route('/')
def index():
    return 'Hello World'

#Flask应用程序实例的run方法启动WEB服务器,仅适用于本地模式
if __name__ == '__main__':
#debug=True会使脚本将任何Flask错误直接打印到浏览器中。
    app.run(debug=True)

WEB应用开发中的关键路径

1.以适当的建模方法快速实现Web应用程序的目标
2.设计和开发本地Web应用程序
3.部署到云平台

一个文件中写入多个路由,这会使代码维护变得困难
问题:一个程序执行文件中,功能代码过多。就是让代码模块化。根据具体不同功能模块的实现,划分成不同的分类,降低各功能模块之间的耦合度。python中的模块制作和导入就是基于实现功能模块的封装的需求。

尝试用模块导入的方式解决: 我们把上述一个py文件的多个路由视图函数给拆成两个文件:app.py和api_export.py文件。app.py文件作为程序启动文件,因为api_export文件没有应用程序实例app,在api_export文件中要使用app.route路由装饰器,需要把app.py文件的app导入到api_export.py文件中。

蓝图

什么是蓝图

蓝图:用于实现单个应用的视图、模板、静态文件的集合。

蓝图就是模块化处理的类。

简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。 在Flask中,使用蓝图可以帮助我们实现模块化应用的功能。

蓝图的运行机制

蓝图是保存了一组将来可以在应用对象上执行的操作。注册路由就是一种操作,当在程序实例上调用route装饰器注册路由时,这个操作将修改对象的url_map路由映射列表。当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项。当执行应用对象的 register_blueprint() 方法时,应用对象从蓝图对象的 defered_functions 列表中取出每一项,即调用应用对象的 add_url_rule() 方法,这将会修改程序实例的路由映射列表。

蓝图的使用

一、创建蓝图对象。

Blueprint必须指定两个参数,api_export表示蓝图的名称,__name__表示蓝图所在模块
api_export= Blueprint(‘api_export’,name)

二、注册蓝图路由。

@api_export.route(’/’)
def index():
return ‘index’

三、在程序实例中注册该蓝图。

app.register_blueprint(api_export,url_prefix=’/api’)

四、项目中实践

程序执行文件/app_main.py

from flask import Flask
from flask_restful import Api
from flasgger import Swagger,swag_from
from export_api import api_export

app = Flask(__name__)

#实例化
#http://localhost:5000/apidocs/#/
template = {
  "swagger": "2.0",
  "info": {
    "title": "API 文档",
    "version": "1.0.0"
  },
  "host": "127.0.0.1:5000",  # overrides localhost:500
  "basePath": "/",  # base bash for blueprint registration
  "schemes": [
    "http"
  ]
}

Swagger(app,template=template)
#实例化一个 Api 对象,用来创建、管理 RESTful Api
api = Api(app)
#注册蓝图
app.register_blueprint(api_export,url_prefix='/api')


#主程序开始
if __name__ == "__main__":
    app.debug = True
    app.threaded = True
    app.run()

创建蓝图:/export_api.py

from flask import Blueprint,request


api_export= Blueprint('api_export',__name__)


@api_export.route('/list/all',methods=['GET'])
def listCfg():
    """
       获取配置文件内容
       ---
       tags:
         - 获取配置
       parameters:
         - in: path
           name: none
           type: none
           required: false
       responses:
         200:
           description: A dict string
           
    """
    return "{'time': '60', 'length': '60', 'height': '150', 'width': '2'}"