一、概述

Python Flask是一个轻量级的Web运用程序结构,它是运用Python编写的,用于快速开发Web运用程序和API。它的规划理念是简略、易用和可扩展。

以下是Python Flask的一些主要特点:

  • 轻量级:Flask没有剩余的库和工具包,使其非常轻量级,这也意味着您能够依据需求增加自己的库。

  • 易用性:Flask的API非常简略,易于理解和学习,因此它非常合适初学者。

  • 可扩展性:Flask是可扩展的,您能够增加插件来增强其功用,并且能够很容易地将其与其他库和结构集成。

  • 灵敏性:Flask答应您挑选所需的组件,例如模板引擎、数据库、表单验证等等。

  • 集成度高:Flask支撑与其他Python库和结构的集成,如SQLAlchemy、WTForms、Jinja2等等。

  • RESTful支撑:Flask易于运用RESTful API,并且能够轻松地创立RESTful Web服务。

总归,Python Flask是一个功用强壮、易于运用、可扩展和灵敏的Web结构,它被广泛运用于Web运用程序和API的开发。

官网:flask.net.cn/

二、Flask 架构

Flask 是一个运用 Python 编写的 Web 运用程序结构。它运用了 Werkzeug 工具箱和 Jinja2 模板引擎。

Flask 结构主要由以下模块组成:

Python Flask 介绍

  • 运用模块:Flask 的中心模块,是整个 Web 运用程序的进口,担任接纳 HTTP 恳求并回来呼应。它还担任路由、错误处理、上下文等功用。

  • 路由模块:Flask 运用装修器来界说 URL 路由和视图函数之间的映射联系。

  • 视图模块:视图函数是 Flask Web 运用程序的中心,它处理 HTTP 恳求并回来呼应,能够回来 HTML 页面、JSON 数据等。

  • 模板模块:Flask 运用 Jinja2 模板引擎来生成 HTML 页面。模板引擎供给了丰富的语法和过滤器,能够轻松地生成杂乱的 HTML 页面。

  • 数据库模块:Flask 能够轻松地与多种数据库集成,包含 MySQL、PostgreSQL、SQLite 等。

  • 表单模块:Flask-WTF 是 Flask 的表单处理扩展,供给了方便的表单处理办法,能够轻松地创立表单、验证表单数据等。

  • 扩展模块:Flask 的扩展模块供给了各种功用,如邮件发送、缓存、登录认证等。

Flask 的规划理念是简略、灵敏、易于扩展,它不会约束开发者的挑选,能够依据开发者的需求挑选各种第三方扩展来增加功用。一起,Flask 也供给了一些根底的功用和工具,方便开发者快速建立 Web 运用程序。

三、运用模块

运用模块是 Flask 结构的中心模块之一,它担任创立 Flask 运用程序目标,并界说一些运用程序等级的装备和功用。运用模块一般包含以下内容:

  • 创立运用程序目标:运用 Flask 类创立运用程序目标。Flask 类的构造函数需求传入运用程序的名称作为参数。

  • 装备运用程序:能够运用 config 特点来装备运用程序的根本特点,如调试形式、密钥、数据库衔接等。

  • 注册路由:运用 route 装修器来注册 URL 路由和视图函数之间的映射联系。路由界说了 HTTP 恳求的 URL 地址和视图函数之间的映射联系。

  • 界说视图函数:视图函数是处理 HTTP 恳求的函数,能够回来 HTML 页面、JSON 数据等。视图函数一般运用 route 装修器界说 URL 路由。

  • 上下文办理:Flask 运用程序运用上下文目标来办理恳求上下文和运用上下文。恳求上下文包含了每个 HTTP 恳求的相关信息,如恳求头、恳求参数等。运用上下文包含了运用程序的相关信息,如装备信息、数据库衔接等。

  • 错误处理:Flask 运用程序能够经过注册错误处理函数来处理 HTTP 恳求中呈现的错误,如 404 错误、500 错误等。

  • 扩展办理:Flask 运用程序能够经过注册扩展目标来增加运用程序的功用,如数据库衔接、缓存、邮件发送等。

  • 发动运用程序:经过 run 办法发动运用程序,使其能够接纳 HTTP 恳求。

运用模块是 Flask 运用程序的中心模块之一,它担任办理整个运用程序的生命周期,是开发 Flask Web 运用程序的重要组成部分。

【示例】 以下是一个简略的 Flask 运用程序示例,演示了如何运用运用模块来创立 Flask 运用程序目标、注册路由和视图函数、装备运用程序等。

from flask import Flask, render_template
app = Flask(__name__)
# 装备运用程序
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'your_secret_key'
# 注册路由和视图函数
@app.route('/')
def index():
    return 'Hello, World!'
@app.route('/user/<name>')
def user(name):
    return 'Hello, %s!' % name
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)
# 发动运用程序
if __name__ == '__main__':
    app.run()

代码讲解:

  • 在上面的示例中,咱们首先导入了 Flask 类和 render_template 函数。然后创立了一个 Flask 运用程序目标,运用了 __name__ 作为运用程序的名称。接着装备了运用程序的一些根本特点,包含调试形式和密钥等。

  • 然后运用 @app.route() 装修器来注册 URL 路由和视图函数之间的映射联系。咱们界说了三个视图函数,别离对应不同的 URL 地址,能够回来不同的呼应内容。其间 /hello//hello/<name> 两个路由对应的是同一个视图函数,运用了 Flask 支撑的多路由规矩。

  • 最终运用 app.run() 办法发动了运用程序,使其能够接纳 HTTP 恳求。

  • 留意,在开发过程中,咱们一般不会将 Flask 运用程序目标的 run() 办法直接放在程序的主体代码中,而是运用一个单独的脚本来发动运用程序,如:

if __name__ == '__main__':
    app.run()

四、路由模块

路由模块是 Flask 运用程序的中心组成部分之一,它完成了 URL 路由和视图函数之间的映射联系。在 Flask 中,咱们能够经过界说路由模块来为运用程序增加不同的路由规矩,使得运用程序能够呼应不同的 URL 恳求。

在 Flask 中,能够运用装修器来界说路由模块。常用的装修器包含:

  • @app.route(rule, options):界说路由规矩和处理函数之间的映射联系。其间 rule 参数表明路由规矩,options 参数表明路由的装备选项。

例如,下面的示例界说了一个路由规矩,用于处理 /hello URL 恳求,并回来一个包含字符串的呼应:

from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello():
    return 'Hello, World!'
  • @app.before_request:在每个恳求被处理之前履行的函数。一般用于履行一些预处理操作,例如验证用户的登录状况、设置全局变量等。

例如,下面的示例界说了一个 before_request 函数,用于在处理恳求之前打印恳求的 HTTP 办法和 URL:

from flask import Flask, request
app = Flask(__name__)
@app.before_request
def log_request():
    print(f'Request: {request.method} {request.url}')
  • @app.after_request:在每个恳求被处理之后履行的函数。一般用于履行一些后处理操作,例如增加呼应头信息、记载日志等。

例如,下面的示例界说了一个 after_request 函数,用于在处理恳求之后增加一个名为 X-My-Header 的呼应头:

from flask import Flask
app = Flask(__name__)
@app.after_request
def add_header(response):
    response.headers['X-My-Header'] = 'Hello, World!'
    return response
  • @app.errorhandler:处理指定错误码的反常,例如 404 错误、500 错误等。能够界说多个不同的错误处理函数,以处理不同的反常情况。

例如,下面的示例界说了一个 404 错误处理函数,用于处理拜访不存在的 URL 时的反常情况:

from flask import Flask, render_template
app = Flask(__name__)
@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

在上面的示例中,咱们界说了一个 page_not_found() 函数,并运用 @app.errorhandler(404) 装修器将其注册为处理 404 错误的函数。在处理 404 错误时,Flask 会调用该函数,并将反常目标作为参数传入。函数回来一个包含错误信息的呼应,并将 HTTP 状况码设置为 404

总归,路由模块是 Flask 运用程序的重要组成部分,它能够经过不同的装修器完成恳求预处理、呼应后处理、错误处理等功用。下面是一个完好的 Flask 路由模块的示例:

from flask import Flask, request, render_template
app = Flask(__name__)
# 恳求预处理函数
@app.before_request
def log_request():
    print(f'Request: {request.method} {request.url}')
# 路由规矩和处理函数
@app.route('/')
def index():
    return 'Hello, World!'
@app.route('/hello')
def hello():
    return 'Hello, World!'
@app.route('/hello/<name>')
def hello_name(name):
    return f'Hello, {name}!'
# 呼应后处理函数
@app.after_request
def add_header(response):
    response.headers['X-My-Header'] = 'Hello, World!'
    return response
# 错误处理函数
@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404
# 发动运用程序
if __name__ == '__main__':
    app.run()

在上面的示例中,咱们界说了一个 Flask 运用程序,并运用 @app.route 装修器界说了三个路由规矩和处理函数:

  • / URL 恳求将会调用 index() 函数,并回来一个字符串 ‘Hello, World!’。
  • /hello URL 恳求将会调用 hello() 函数,并回来一个字符串 ‘Hello, World!’。
  • /hello/<name> URL 恳求将会调用 hello_name(name) 函数,并回来一个包含 name 参数的字符串 ‘Hello, {name}!’。

咱们还运用了 @app.before_request 装修器界说了一个恳求预处理函数 log_request(),用于在每个恳求被处理之前打印恳求的 HTTP 办法和 URL

一起,咱们还运用了 @app.after_request 装修器界说了一个呼应后处理函数 add_header(response),用于在每个恳求被处理之后增加一个名为 X-My-Header 的呼应头。

最终,咱们运用 @app.errorhandler 装修器界说了一个 404 错误处理函数 page_not_found(e),用于处理拜访不存在的 URL 时的反常情况。

整个路由模块的代码非常简略明了,经过 Flask 供给的装修器能够轻松地界说路由规矩和处理函数,完成不同 URL 恳求的呼应。

五、视图模块

在 Flask 中,视图模块用于处理恳求并生成呼应,一般由视图函数来完成。视图函数担任处理一个或多个 URL 恳求,并回来一个呼应目标。呼应目标能够是纯文本、HTML、JSON、图画等。

下面是一个简略的 Flask 视图模块的示例:

from flask import Flask, request, jsonify
app = Flask(__name__)
# 视图函数
@app.route('/hello')
def hello():
    name = request.args.get('name', 'World')
    return f'Hello, {name}!'
@app.route('/json')
def json():
    data = {'message': 'Hello, World!'}
    return jsonify(data)
# 发动运用程序
if __name__ == '__main__':
    app.run()

在上面的示例中,咱们界说了两个视图函数:

  • hello() 函数处理 /hello URL 恳求,运用 request.args.get() 办法获取恳求参数中的 name 参数(默认为 'World'),并将其刺进到呼应字符串中回来给客户端。
  • json() 函数处理 /json URL 恳求,生成一个包含 message 特点的字典目标,然后运用 Flask 供给的 jsonify() 函数将其转换为 JSON 格局的呼应目标回来给客户端。

发动 Flask 运用程序后,能够在浏览器中拜访 /hello/json URL 来测试视图函数的效果。

视图函数是 Flask 运用程序的中心组成部分,能够经过不同的方式生成呼应,如运用模板引擎烘托 HTML 页面、回来纯文本或 JSON 数据等。视图函数还能够接受恳求参数,经过 request 目标获取恳求数据,并依据恳求参数生成相应的呼应。

六、模板模块

在 Flask 中,模板模块用于生成动态的 HTML 页面或其他类型的文档。Flask 支撑多种模板引擎,如 Jinja2、Mako、Mustache 等,其间 Jinja2 是最常用的模板引擎之一。

下面是一个简略的 Flask 模板模块的示例,运用 Jinja2 模板引擎烘托一个 HTML 页面:

from flask import Flask, render_template
app = Flask(__name__)
# 路由规矩和视图函数
@app.route('/')
def index():
    return render_template('index.html', name='World')
# 发动运用程序
if __name__ == '__main__':
    app.run()

在上面的示例中,咱们界说了一个路由规矩 /,并运用 render_template() 函数将模板文件 index.html 烘托为 HTML 页面,其间传递了一个名为 name 的变量值为 'World'

下面是 index.html 模板文件的示例:

<!DOCTYPE html>
<html>
  <head>
    <title>Hello, {{ name }}!</title>
  </head>
  <body>
    <h1>Hello, {{ name }}!</h1>
  </body>
</html>

代码讲解:

  • 在上面的示例中,运用了 Jinja2 模板引擎的语法 {{ name }},它将在烘托模板时被替换为 render_template() 函数中传递的 name 变量的值。

  • 发动 Flask 运用程序后,拜访根 URL / 将会回来一个包含 Hello, World! 的 HTML 页面。

  • 模板模块是 Flask 运用程序的重要组成部分,它能够完成动态生成各种类型的文档,如 HTML 页面、JSON 数据、CSV 文件等。在 Flask 中,运用模板引擎能够方便地将数据和 HTML 页面进行别离,完成愈加清晰和易于维护的代码结构。

七、数据库模块

在 Flask 运用程序中,一般需求运用数据库来存储和办理数据。Flask 供给了多种数据库模块的支撑,如 SQLAlchemyPeeweeMongoDB 等。

下面以 SQLAlchemy 为例,介绍如安在 Flask 运用程序中运用数据库模块。

1)装置 SQLAlchemy

运用 pip 装置 SQLAlchemy:

pip install SQLAlchemy

2)装备数据库衔接

在 Flask 运用程序中,需求装备数据库衔接,包含数据库类型、主机名、端口号、数据库名、用户名和暗码等。能够运用 Flask 运用程序的装备目标 app.config 来存储这些装备信息,如下所示:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@localhost/mydatabase'
db = SQLAlchemy(app)

在上面的示例中,咱们运用 SQLAlchemy 模块创立了一个数据库衔接 db,并将其关联到 Flask 运用程序目标 app 上。

3)界说数据库模型

运用 SQLAlchemy 模块能够方便地界说数据库模型,例如下面的示例界说了一个简略的用户模型:

from datetime import datetime
from sqlalchemy import Column, Integer, String, DateTime
class User(db.Model):
    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False)
    email = Column(String(120), unique=True, nullable=False)
    created_at = Column(DateTime, default=datetime.now)

在上面的示例中,咱们运用 SQLAlchemy 供给的 Column 类界说了三个列:idnameemailcreated_at。其间,id 是主键列,nameemail 是字符串列,created_at 是日期时间列。

4)数据库操作

运用 SQLAlchemy 模块能够方便地履行数据库操作,例如下面的示例:

# 创立数据库表
db.create_all()
# 刺进数据
user = User(name='Alice', email='alice@example.com')
db.session.add(user)
db.session.commit()
# 查询数据
users = User.query.all()
# 更新数据
user.name = 'Bob'
db.session.commit()
# 删去数据
db.session.delete(user)
db.session.commit()

在上面的示例中,咱们运用 db.create_all() 创立数据库表,运用 db.session.add() 刺进数据,运用 User.query.all() 查询数据,运用 db.session.commit() 提交事务。还能够运用 db.session.query() 查询数据,运用 db.session.filter() 过滤数据,运用 db.session.order_by() 排序数据等。

数据库模块是 Flask 运用程序的中心组成部分之一,它能够方便地完成数据的存储和办理,为 Web 运用程序供给强壮的数据支撑。在运用数据库模块时,需求留意数据的安全性和可靠性,如避免 SQL 注入攻击、处理事务、运用数据库索引等。

八、表单模块

表单模块是 Flask 运用程序中常用的组件之一,它能够方便地完成用户输入的数据验证和处理。在 Flask 中,表单模块一般运用 WTForms 库完成。

下面介绍如安在 Flask 运用程序中运用表单模块。

1)装置 WTForms

运用 pip 装置 WTForms:

pip install WTForms

2)创立表单类

在 Flask 运用程序中,需求界说一个表单类来描述需求接纳的数据和对数据进行验证的规矩。例如下面的示例界说了一个简略的用户注册表单:

from wtforms import Form, StringField, PasswordField, validators
class RegistrationForm(Form):
    name = StringField('Name', [validators.Length(min=4, max=25)])
    email = StringField('Email', [validators.Email()])
    password = PasswordField('Password', [
        validators.DataRequired(),
        validators.EqualTo('confirm_password', message='Passwords must match')
    ])
    confirm_password = PasswordField('Confirm Password')

在上面的示例中,咱们运用 WTForms 供给的 Form 类界说了一个表单类 RegistrationForm,并界说了三个字段:nameemailpassword。对于每个字段,咱们运用不同的验证器进行验证,例如 validators.Lengthvalidators.Emailvalidators.EqualTo 等。

3)在视图函数中运用表单

在 Flask 运用程序中,需求运用表单类来接纳用户提交的数据,然后对数据进行验证和处理。例如下面的示例界说了一个处理用户注册的视图函数:

from flask import render_template, request
from .forms import RegistrationForm
@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm(request.form)
    if request.method == 'POST' and form.validate():
        # 处理用户注册数据
        return 'Registration successful!'
    return render_template('register.html', form=form)

在上面的示例中,咱们运用表单类 RegistrationForm 来接纳用户提交的数据,然后在视图函数中运用 request.form 办法获取表单数据,并运用 form.validate() 办法验证表单数据是否合法。假如表单数据验证经过,则进行用户注册操作,并回来注册成功的音讯。

4)烘托表单模板

在 Flask 运用程序中,需求运用模板引擎来烘托表单模板,并将表单类传递给模板。例如下面的示例界说了一个注册表单模板:

<form method="POST">
    {{ form.name.label }} {{ form.name }}
    {{ form.email.label }} {{ form.email }}
    {{ form.password.label }} {{ form.password }}
    {{ form.confirm_password.label }} {{ form.confirm_password }}
    <button type="submit">Register</button>
</form>

在上面的示例中,咱们运用表单类 RegistrationForm 中的字段 nameemailpasswordconfirm_password 烘托表单模板,并运用 form.name.labelform.name 等特点来获取标签和输入框的 HTML 代码。

表单模块是 Flask 运用程序中常用的组件之一。

九、扩展模块

在 Flask 运用程序中,扩展模块能够协助咱们更方便地完成某些功用或处理某些问题。下面介绍一些常用的 Flask 扩展模块。

  1. Flask-WTF:Flask-WTF 是一个 WTForms 的 Flask 扩展,它为 Flask 运用程序供给了更方便的表单处理和 CSRF 维护等功用。运用 Flask-WTF 能够大大简化表单处理的代码,一起进步运用程序的安全性。

  2. Flask-Login:Flask-Login 是一个用于用户身份验证和办理的 Flask 扩展,它供给了用户登录和登出等功用,还能够方便地办理用户状况和权限等信息。运用 Flask-Login 能够大大简化用户身份验证和办理的代码,一起进步运用程序的安全性。

  3. Flask-SQLAlchemy:Flask-SQLAlchemy 是一个 SQLAlchemy 的 Flask 扩展,它供给了对联系型数据库的支撑,例如 MySQL、PostgreSQL 和 SQLite 等。运用 Flask-SQLAlchemy 能够方便地进行数据库操作,例如创立表、刺进数据和查询数据等。

  4. Flask-Cache:Flask-Cache 是一个缓存的 Flask 扩展,它供给了缓存功用,能够将运用程序中的一些计算结果缓存起来,以减少计算量和呼应时间。运用 Flask-Cache 能够进步运用程序的功用和呼应速度。

  5. Flask-Mail:Flask-Mail 是一个邮件发送的 Flask 扩展,它供给了发送邮件的功用,能够方便地发送邮件给用户或办理员等。运用 Flask-Mail 能够大大简化发送邮件的代码,一起进步运用程序的交互性和用户体会。

以上是一些常用的 Flask 扩展模块,它们能够协助咱们更方便地完成某些功用或处理某些问题。当然,还有许多其他的 Flask 扩展模块,能够依据实际需求挑选运用。


Python Flask 介绍就先到这儿了,后续会继续更新相关技能类文章,也可重视我公众号【大数据与云原生技能共享】深入技能交流和问题咨询~