一、背景
Flask 是一个微型的(轻量)使用Python 语言开发的 WSGI Web 框架(一组库和模块),基于Werkzeug WSGI工具箱/库和Jinja2 模板引擎,当然,Python的WEB框架还有:Django、Tornado、Webpy,这暂且不提。 Flask使用BSD授权。 Flask也被称为microframework(微框架),Flask 的目标是保持核心简单而又可扩展,即它采用了简单的核心,缺省情况下, Flask 不包含数据库抽象层、表单验证或者其他已有的库可以处理的东西,其他的功能可用Flask-extension增加:ORM、窗体验证工具、文件上传、各种开放式身份验证技术等就行Flask原生一样。由于这些特性,它使用简单,自由性强,可以帮助用户很方便得快捷搭建自己的web服务器,被广泛应用,尤其适合构建小到中型规模的Web应用。 另外,Flask支持RESTful ,Flask很容易使用RESTful API,可以轻松地创建RESTful Web服务。Flask与别的框架(尤其是采用其他编程语言的框架)的不同之处在于:它没有绑定诸如数据库查询或者表单处理等功能库,以及它们所组成的整个生态系统。它倾向于对这些功能的实现方式不做任何限定,让开发者更专注于核心代码,随需扩展。下图是场景的一种Flask Web架构:
现场业务场景中采用如上图类似的架构,也通过gunicorn管理Flask web项目,对外提供服务;但是集团要求,要全部实现ipv6(三级ipv6实现:浏览器内转三级功能,都完成支持ipv6);现场发现Flask web应用并没监听ipv6地址,Gunicore也未监听;那如何配置呢,最终实现IPv4/6双栈支持。
现场环境版本: Python3.6.3和2.7.18、Werkzeug (0.16.0)、tensorflow (1.6.0)、numpy (1.18.0)、wheel (0.33.6)
、wrapt (1.11.2)、setuptools (42.0.2)、six (1.13.0)、opencv-python (4.1.2.30)、pandas (0.25.3)、Jinja2 (2.10.3)、gunicorn (19.9.0)、gevent (1.3.5)、Flask (1.1.1)、Click (7.0)、backports.lzma (0.0.14)、
相关资源链接:jinja、Flask中文文档、Flask英文文档、python-docx、pandas、sourceforge、codingdict编程字典、pytorch中文、numpy中文、numpy文档、python3、Flask中文文档、Flask介绍、Flask快速指南、Flask GitHub、Flask三方文档、gunicorn配置指导、前端入门和进阶学习笔记、Flask官方文档
二、Flask框架及说明
2.1、相关概念回顾
WSGI:即Web服务器网关接口(WSGI), 它是Web服务器和Web应用程序之间通用接口的规范。已被采纳为Python Web应用程序开发的标准。WSGI将Web服务分成两个部分:服务器和应用程序。WGSI服务器只负责与网络相关的两件事:接收浏览器的HTTP请求、向浏览器发送HTTP应答;而对HTTP请求的具体处理逻辑,则通过调用WSGI应用程序进行。Python使用wsgi网关进行Web开发,flask基于wsgi网关,flask中实例的app,也称之为一个wsgi 应用。
WERKZEUG:它是一个WSGI工具包,实现了请求,响应对象和其他实用程序功能。 这可以在其上构建Web框架。 Flask框架使用Werkzeug作为其一个基础模块之一。
Jinja2:它是Python的流行模板引擎。 网页模板系统将模板与特定的数据源结合起来就能呈现出动态网页。
Python的框架基本都是MTV的:
M:Models 模型层,负责数据库建模 与数据库打交道
T:Templates 模板层,用于处理用户显示的网页内容
V:Views:视图层,负责业务逻辑,并在适当时候调用Model和Template,用于处理与用户交互的部分,处理用户的请求并给出响应内容。
URL分发器:将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template
当Flask Web项目运行时, 如果接收到前端的请求时通过控制层解析并且匹配route路由找到相应的视图函数之后执行业务层逻辑的处理, 在业务逻辑处理的时候如有需要便可以快速调用REST API接口以对接特定的服务;当有需要操作数据库时便可以交给数据层处理, 数据库的操作可调用ORM模型将数据库内容实例化成对象来完成数据访问。
而其他语言框架多采用MVC架构:
M:Models 模型层,负责业务对象和数据库的关系映射(ORM)。
V:Wiews 视图层,用处处理用户显示的内容的,等同于MTV的 T
C:Controller:控制器,处理用户的请求与响应等同于MTV的 V
三个部分的关系示意图如下:
Flask框架的一些概念:
1.应用程序对象:应用程序对象是Flask应用程序的核心对象。它是一个Flask类的实例。应用程序对象是用于创建Web应用程序的主要接口。
2.上下文:Flask框架中有两种上下文:应用程序上下文和请求上下文。应用程序上下文为应用程序提供了一个全局上下文,而请求上下文则为每个请求提供了一个上下文。
3.路由:它是Flask应用程序中的URL映射。它指定了URL与视图函数之间的关系。
4.视图函数:视图函数是Flask应用程序中处理请求的函数。它们使用装饰器将路由绑定到函数上。
5.模板:模板是Flask应用程序中用于渲染HTML页面的文件。它们使用Jinja2模板引擎进行渲染。
6.表单:表单是Flask应用程序中用于收集用户输入数据的HTML表单。一般使用WTForms库进行验证和处理。
对比,Flask 框架主要的模块如下:
1、应用模块:Flask 的核心模块,负责创建 Flask 应用程序对象,并定义一些应用程序级别的配置和功能,负责管理整个应用程序的生命周期。它是整个 Web 应用程序的入口,负责接收 HTTP 请求并返回响应。它还负责路由、错误处理、上下文等功能。
2、路由模块:Flask 使用装饰器来定义 URL 路由和视图函数之间的映射关系。
3、视图模块:视图函数是 Flask Web 应用程序的核心,它处理 HTTP 请求并返回响应,可以返回 HTML 页面、JSON 数据等。
4、模板模块:Flask 使用 Jinja2 模板引擎来生成 HTML 页面。模板引擎提供了丰富的语法和过滤器,可以轻松地生成复杂的 HTML 页面。模板就是一个包含响应文本的文件 通常也是HTMl文件,该文件中可以包含“占位变量” 来表示动态的内容,具体值 只有在请求中才能获取 “占位变量"最后会被真实的值替换,模板最终也会被解析成响应的字符串 这一过程也称为"渲染”。默认情况下 Flask会在程序文件夹中的 templates 子文件夹中自动寻找模板,默认需要收动创建 templates 子文件夹 ,里面放HTML文件。
5、数据库模块:Flask 可以轻松地集成多种数据库,包括 MySQL、PostgreSQL、SQLite 等。
6、表单模块:Flask-WTF 是 Flask 的表单处理扩展,提供了方便的表单处理方法,可以轻松地创建表单、验证表单数据等。
7、扩展模块:Flask 的扩展模块提供了各种功能,如邮件发送、缓存、登录认证等。
其中,应用模块通常包括以下内容:
1)创建应用程序对象:使用 Flask 类创建应用程序对象。Flask 类的构造函数需要传入应用程序的名称作为参数。
2)配置应用程序:可以使用 config 属性来配置应用程序的基本属性,如调试模式、密钥、数据库连接等。
3)注册路由:使用 route 装饰器来注册 URL 路由和视图函数之间的映射关系。路由定义了 HTTP 请求的 URL 地址和视图函数之间的映射关系。
4)定义视图函数:视图函数是处理 HTTP 请求的函数,可以返回 HTML 页面、JSON 数据等。视图函数通常使用 route 装饰器定义 URL 路由。
5)上下文管理:Flask 应用程序使用上下文对象来管理:请求上下文和应用上下文。请求上下文包含了每个 HTTP 请求的相关信息,如请求头、请求参数等。应用上下文包含了应用程序的相关信息,如配置信息、数据库连接等。
6)错误处理:Flask 应用程序可以通过注册错误处理函数来处理 HTTP 请求中出现的错误,如 404 错误、500 错误等。
7)扩展管理:Flask 应用程序可以通过注册扩展对象来增加应用程序的功能,如数据库连接、缓存、邮件发送等。
8)启动应用程序:通过 run 方法启动应用程序,使其可以接收 HTTP 请求。
#导入了 Flask 类和 render_template 函数,Flask使用render_template 函数封装了Jinja2模板引擎,web网页模板需要flask内的render_template模块
from flask import Flask,render_template
#创建了一个 Flask 应用程序对象,使用了__name__ 作为应用程序的名称
app = Flask(__name__)
#配置应用程序的基本属性,包括调试模式和密钥等
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'your_secret_key'
#或者单独写入待外部文件,这里调用即可
app.config.from_pyfile('config.ini')
'''注册路由和视图函数;使用 @app.route() 装饰器来注册 URL 路由和视图函数之间的映射关系
定义了三个视图函数,分别对应不同的 URL 地址,对应返回不同的响应内容'''
@app.route('/')
def hello():
return 'hello world'
@app.route('/user/<name>')
def user(name):
return 'Hello, %s !' % name
#/hello/ 和 /hello/<name> 两个路由对应的是同一个视图函数,使用了 Flask 支持的多路由规则
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name) '''使用render_template模块来渲染模板文件,通过第二个参数传递数据变量;传入render_template()内的第一个参数是html模板名,后面的参数都是键值对;传参时是赋值式(在html内的标识)= (传入的变量名),也可以用args,把数据以key value 形式传入字典把整个字典变量名传入到html里,直接调用key即可'''
#字典传入模板案例
@app.route('/')
def index():
my_str = 'hello world'
my_int = 123
my_list = [1, 2, 3, 48, 93]
my_dict = {
'name': '张兰', 'age': 19