开始使用Flask,一个Python微框架

本文将介绍Flask,这是一个流行的Python微框架,它为庞大的Django提供了一个替代方案。

Flask旨在轻量级和灵活,使开发者能够快速轻松地创建Web应用程序。本文将涵盖Flask是什么,其关键特性,其简单API的好处,支持第三方扩展的灵活性,最常见的Flask扩展,以及何时以及何时不适合使用Flask。

关键要点

  1. Flask功能和用例概述:本文介绍Flask,强调其轻量级、灵活的特性,以及适用于各种Web项目的适宜性。它探讨了Flask的简洁性、扩展支持、关键特性以及实用用例,如原型设计、RESTful API和电子商务应用。

  2. 与Django的比较分析:文章对比Flask与Django,强调Flask的微框架方法提供了基本工具而不带来复杂性,使其成为需要极简主义和定制扩展的项目的理想选择。

  3. 开始使用Flask: 文章提供了一份详细的步骤指南,包括搭建Flask开发环境、创建并运行基础应用,以及利用Flask在路由、模板、表单和扩展方面的功能。

什么是Flask?

Flask是一个用Python编写的微型网络框架,用于开发网络应用程序。它秉承简单轻便的理念,仅提供构建网络应用所需的最重要工具,避免不必要的复杂性。

它基于Werkzeug WSGI工具包构建,该工具包提供处理请求和响应所需的网络服务器功能,以及Jinja2模板引擎,使Flask能够处理HTML模板,便于开发者创建动态网络应用。

以下是Flask的一些关键特性,使其成为一个出色的框架:

  • 它具有简单的API用于创建网络路由和处理请求。
  • Jinja模板引擎支持HTML模板,便于开发者轻松创建网页。
  • 其高度可扩展性得益于对第三方扩展的支持,开发者可根据项目需求安装相应扩展。
  • 内置的开发服务器简化了应用的测试与调试过程。

总体而言,Flask提供了一个强大、灵活且简洁的框架,适用于构建各类Web应用。无论是新手还是经验丰富的开发者,Flask都是一个优秀的选择,同时也是Python Web开发领域中最流行的框架之一。

Flask的优势

接下来,我们将深入探讨使用Flask进行开发的一些显著优势。

简洁性。Flask的设计理念注重简洁,使得各个水平的开发者都能轻松理解和应用。这也意味着开发者无需经历漫长的学习曲线,仅需掌握少数概念和API即可开始构建Web应用。

灵活性。作为微框架,Flask仅提供Web框架的核心功能,赋予开发者通过Flask扩展或第三方库自定义和扩展框架以满足特定需求的强大能力。

文档完备。Flask的文档详尽全面,从基础到高级主题均有良好覆盖,极大地方便了开发者学习如何使用该框架。

兼容性。Flask 支持广泛的 Python 版本,这使得它易于与现有的 Python 代码库集成。同时,它还支持多种 Web 服务器,便于在各种托管平台上部署。

快速开发。Flask 的简洁性和灵活性减少了设置应用程序所需的基础代码,使开发者能够迅速启动项目。

在网络的各个角落,Flask 被用于许多有趣的方式。一些显著的例子包括:

  • PgAdmin。Postgres 的管理界面运行在 Flask 实例上,为开发者提供了一个管理 Postgres 数据库的界面。
  • Twilio。这是一个通信平台,其多个 API 使用了 Flask。
  • Pinterest。这个图片分享应用在其 Web 开发堆栈中使用了 Flask,使其团队能够轻松创建一些定制功能和集成。

何时使用 Flask

Flask 的简洁性和易用性使其成为各种 Web 项目的优秀选择:

  • 原型制作。其易用性和灵活性使其成为快速创建原型的理想选择,使开发者能够快速构建和测试新功能。
  • 创建 RESTful API。其简单的 API 使得创建和处理 HTTP 请求变得容易。
  • 电子商务应用。它非常适合构建在线市场和电子商务平台。
  • 金融。它对于构建金融应用非常有用,包括账户管理、交易处理和投资追踪功能。
  • 人工智能。它提供了一种简便直接的方式来构建和部署AI训练模型。

何时不宜使用Flask

尽管Flask是一个出色的框架,拥有众多优点和强大的特性,但在某些情况下,这些特性反而成为其劣势。我们来探讨一些更适合其他类型框架的项目。

需要内置功能的项目。作为一个微框架,Flask仅提供创建Web应用所需的核心组件。如果项目需要,例如管理员界面、认证或ORM,那么Django会是更好的选择。

对安全性要求严格的项。由于Flask的灵活性,我们需依赖第三方扩展来在应用中实现一定级别的安全性。虽然这确实可行,但依赖一个经过更多实战检验、采取更安全策略的框架,如Tornado或Twisted,会更为稳妥。

强制执行某种编码标准的项目。Flask的灵活性使得开发者可以按自己认为合适的任何方式开发应用。然而,像Django这样的框架确保开发者遵循特定的约定,这意味着开发者可以轻松地从一个项目转移到另一个项目。

搭建Flask开发环境

现在让我们一起探索如何开始使用Flask,从搭建开发环境、进行安装,到最终启动一个最小化的应用。

前提条件

开发机器上必须已安装Python。这里有安装指南(尽管我们可能已经安装了)。

创建虚拟环境

A virtual environment is an isolated Python environment where we can install packages for a given project without affecting the global Python installation. (Here’s further discussion about why virtual environments are useful.) There are different packages for creating virtual environments in Python, such as virtualenv, venv, or Conda.

本文中,我们将使用virtualenv。可以通过以下命令安装它:

pip install virtualenv

安装好virtualenv后,我们需创建一个存放Flask应用的目录。目录名可自由选择,只要不是Flask,以免引起冲突。我们将其命名为flask_intro

mkdir flask_intro

接下来,切换到该目录以便开始使用:

cd flask_intro

在该目录下,现在让我们创建虚拟环境,使用以下命令:

virtualenv myenv

上述命令会创建一个名为myenv的虚拟环境。让我们激活它以便在其中安装Flask。在LinuxmacOS上,使用以下命令激活虚拟环境:

. myenv/bin/activate

而在Windows上,则使用此命令:

. myenv\Scripts\activate

一旦虚拟环境激活,shell提示符将显示虚拟环境的名称,类似于以下输出:

(myenv)/~(path to your project directory)$

在我们激活的虚拟环境中,可以继续安装Flask,使用以下命令:

pip install Flask

Flask安装完成后,我们接下来创建一个最小化的应用程序。我们将创建一个模块来存放我们的Flask应用。为了简单起见,我们将其命名为hello.py。在LinuxmacOS系统中,我们可以使用以下命令在flask_intro目录下创建该文件:

touch hello.py

上述命令将创建一个名为hello.py的文件。我们也可以使用开发环境来创建这个文件。文件创建后,将下面的代码放入其中并保存:


# hello.py

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, World!'

在上面的代码中,我们从flask模块导入Flask类,然后创建一个名为appFlask实例,并传递__name__变量。

接着,我们使用路由装饰器@app.route(“\”),这意味着当有人访问我们应用程序的根路由时,hello_world()函数将被触发。

运行应用程序有多种方式,下面我们来看看其中一些。第一种方式是向flask命令提供一系列参数:--app,接着是存放我们Flask应用的模块名称,然后是run。如下所示:

flask –app <the name of your module> run

使用上述示例来运行我们的示例应用程序:

flask –app hello run

这将使我们的应用程序运行在默认端口5000上,因此应用程序可以通过http://localhost:5000/http://127.0.0.1:5000/访问。如果我们希望应用程序在不同的端口上可用,我们可以使用-p--port选项指定端口。例如:

flask --app hello run --port=8080

这将使服务器运行在端口8080。另一种运行应用程序的方式是直接使用flask run命令。然而,为了能够这样做,我们需要告诉Flask包含Flask实例的模块名称,我们通过设置FLASK_APP环境变量来实现这一点。因此,在我们的例子中,Flask应用程序包含在一个名为hello.py的文件中。我们可以这样设置:

export FLASK_APP=hello

现在我们已经设置了FLASK_APP环境变量,我们可以这样运行开发服务器:

flask run

通过这段代码,我们现在运行了一个Web应用程序。这展示了Flask的核心理念:我们不需要大量样板代码就能启动项目。然而,我们上面设置的应用程序并不是非常实用,因为它只在我们的网页上渲染了字符串“Hello World!”。为了实现更多功能,我们可以转向模板。接下来我们将探讨如何处理它们。

Flask模板

Flask模板是一种创建动态网页的方式,这些网页可以根据各种因素(如来自数据库的数据或用户输入)显示不同的内容。Flask中的模板是HTML和特殊占位符(称为模板变量)的组合,这些占位符在运行时被实际值替换。

模板存储在templates目录中。因此,要使用模板,我们需要从flask导入render_template()方法。render_template()方法接受一个模板名称以及任何需要传递给模板的可选数据。

让我们看一个使用模板渲染网页的函数示例:

# index.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
    title = 'Welcome to my website!'
    message = 'This is an example of using Flask templates.'
    return render_template('index.html', title=title, message=message)

在上面的例子中,我们有一个视图函数——index()——通过@app.route()装饰器绑定到根URL(“/”)。该函数有两个变量,titlemessage。最后,我们将模板index.html连同titlemessage变量一起传递给render_template()方法。

为了使上述代码生效,我们需要在模板目录中有一个index.html模板。因此,模板看起来会是这样的:

# index.html
<!doctype html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ message }}</p>
</body>
</html>

index.html文件中,占位符{{title}}{{ message }}被替换为在render_template()方法中传递给模板的值。

模板还可以包含更复杂的逻辑,如if语句和for循环,这允许生成更动态的页面。

因此,Flask中的模板为开发者提供了一个非常强大的选项,用于创建充满用户生成信息的动态网页。

Flask路由

大多数网络应用程序都会有多个URL,因此我们需要一种方法来了解哪个函数处理哪个URL。在Flask中,这种映射被称为路由——即将URL绑定或映射到视图函数的过程。将URL绑定到视图函数使得应用程序能够处理不同类型的请求,如GETPOSTPUTDELETE等。它还使应用程序能够处理来自不同客户端的多个请求。

要在Flask中设置路由,我们使用route() 装饰器。该装饰器将一个URL绑定到一个视图函数——因此当用户访问我们应用程序上存在的URL时,Flask会触发相关的视图函数来处理请求。

让我们看一个例子:


# hello.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/about")
def about():
    return "This is the about page"

在上面的例子中,我们定义了一个关于URL(/about)。当应用程序接收到对about URL的请求时,Flask调用about()函数,该函数返回字符串“这是关于页面”。

到目前为止,尽管这些例子返回不同的页面,但它们都只使用了GET HTTP请求。为了能够处理任何特定请求,我们可以将HTTP方法作为route()装饰器的可选参数指定。

让我们看一个PUT请求的例子:

from flask import Flask, request

app = Flask(__name__)

@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
    从请求体中获取用户数据
    data = request.get_json()
    对用户数据进行处理,例如在数据库中更新用户信息
    ...
    返回一个响应,指示操作成功或失败
    return {'message': f'User {user_id} updated successfully'}, 200

在此示例中,我们定义了一个处理PUT请求的路由,用于更新指定user_id的用户详情。我们在路由中使用<int:user_id>来表明用户ID应为整数。

update_user()函数中,我们使用request.get_json()方法从请求体中获取用户数据。我们对用户数据进行处理,例如在数据库中更新用户信息,然后返回一个响应,指示操作成功或失败,并附带HTTP状态码(本例中为200,表示成功)。

总体而言,路由使Flask能够处理不同类型的请求,并根据用户访问的URL以不同方式处理和响应数据。

Flask表单与验证

除了向用户展示数据外,Flask模板还能接收用户输入以进行进一步处理或存储。为此,Flask内置了处理HTML表单和用户输入的支持。Flask表单基于WTForms库,该库提供了处理表单数据和执行验证的灵活而强大的方法。然而,该库并非Flask标准安装的一部分,因此我们需要使用以下命令进行安装:

pip install WTForms

安装WTForms后,要在Flask中使用表单,我们需要定义一个继承自flask_wtf.FlaskForm的表单类。该类将包含表单上的字段以及应应用于这些字段的任何验证规则。

下面是一个登录表单的示例:

# forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, Length

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
    submit = SubmitField('Log In')

在上面的例子中,我们定义了一个包含两个字段——emailpassword——以及一个提交按钮的登录表单。我们还使用了validators参数来指定每个字段的验证规则。例如,在这种情况下,我们要求email字段包含一个有效的电子邮件地址,而password字段包含不少于六个字符的密码。

定义了表单类后,我们可以在登录视图函数中使用它来渲染表单并处理用户提交的表单数据。下面是视图函数的一个示例:

# views.py
from flask import render_template, request
from .forms import LoginForm

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        email = form.email.data
        password = form.password.data
        # 对表单数据进行处理
    return render_template('login.html', form=form)

在上面的例子中,我们有一个login视图,它接受两种HTTP方法(GETPOST),因此当用户从浏览器访问URL时,LoginForm通过render_template方法作为HTML表单渲染,当用户提交表单时,我们使用validate_on_submit方法检查表单是否有效。如果表单有效,我们获取电子邮件和密码。

login.html表单可能看起来像这样:

# login.html
<h1>Login</h1>
<form method="POST">
  {{ form.csrf_token }}
  <div>
    {{ form.email.label }} {{ form.email() }}
    {% for error in form.email.errors %}
    <span style="color: red;">[{{ error }}]</span>
    {% endfor %}
  </div>
  <div>
    {{ form.password.label }} {{ form.password() }}
    {% for error in form.password.errors %}
      <span style="color: red;">[{{ error }}]</span>
    {% endfor %}
  </div>
  {{ form.submit() }}
</form>

上述模板将渲染出emailpassword字段及其标签,以及一个带有“登录”文本的提交按钮。form.csrf_token字段的包含是为了防止跨站请求伪造(CSRF)攻击。{% for %}循环用于展示可能发生的验证错误。

通过使用Flask表单,我们拥有了一种强大的处理用户输入的方式,并且能够验证他们输入的数据。

Flask扩展

如我们所见,Flask是一个微框架,仅包含创建Web应用程序所需的最重要部分。然而,如果我们需要添加Flask默认不提供的功能,我们需要添加包到安装中。Flask扩展是我们提供这种额外功能的方式。我们可以简单地安装所需的包。Flask社区制作了许多扩展。

以下是一些最受欢迎的:

  • Flask-SQLAlchemy:提供与SQLAlchemy工具包的集成,使得与数据库的交互变得简单。
  • Flask-Login:为Flask提供用户认证和会话管理。
  • Flask-Mail:提供了一个简单的界面,用于从Flask发送电子邮件。

Flask社区制作了数百个扩展,用于处理不同的功能。使用扩展通常很简单。首先,我们需要使用pip安装我们想要的扩展。

让我们看一个使用Flask-SQLAlchemy的例子。首先,我们需要安装它:

pip install flask-sqlalchemy

接下来,我们需要进行配置。例如:

# sqlalchemy_example.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

在上面的例子中,我们有一个User模型,包含usernameemail字段。我们还配置了SQLALCHEMY_DATABASE_URI,表明我们正在使用位于example.db的SQLite数据库。设置好后,我们现在可以通过db对象与数据库进行交互。例如,我们可以创建一个新用户并将其添加到数据库中,如下所示:

#views.py 
from app import db, User

user = User(username='john', email='[email protected]')
db.session.add(user)
db.session.commit()

借助Flask扩展,我们的应用程序能够拥有比仅使用核心Flask实现更多的功能。

结论

在本文中,我们介绍了Flask,一个Python的轻量级和灵活的Web框架。我们讨论了使用Flask进行Web开发的优点,包括其简单性、灵活性和易用性。我们还介绍了如何设置开发环境、创建路由、使用模板、处理表单以及使用扩展如Flask-SQLAlchemy。

总而言之,Flask是构建任何规模的Web应用的绝佳选择,从小型个人项目到大型商业应用。它易于学习和使用,同时通过其众多扩展提供高级功能。

如果您对深入了解Flask感兴趣,以下是一些额外的资源:

若您想深入了解Django与Flask及其最佳应用场景,不妨查阅Python Web开发:Django与Flask.

关于Flask的常见问题解答

Flask是什么?

Flask是一个为Python设计的微型网络框架。它以轻量级和易用性为设计宗旨,非常适合开发网络应用及API。

如何安装Flask?

您可通过Python的包管理器pip来安装Flask,只需执行命令pip install Flask即可在您的系统上安装Flask。

Flask的关键特性有哪些?

Flask以其简洁、灵活和极简主义而闻名。它提供了诸如URL路由、请求处理和模板渲染等特性,同时允许开发者根据需要选择并集成其他组件。

Flask与其他Python网络框架如Django相比有何不同?

Flask是一个微框架,而Django则是一个全栈式Web框架。Flask提供了更多的灵活性和选择组件的自由度,而Django则自带了许多内置功能和约定。

我可以用Flask构建RESTful API吗?

是的,Flask非常适合构建RESTful API。它的简洁性和对HTTP方法的支持使其成为创建API端点的流行选择。

Flask适合用于大型Web应用程序吗?

Flask可以用于大型应用程序,但可能需要更多的手动配置以及与额外组件的集成,相比全栈框架如Django而言。

Source:
https://www.sitepoint.com/flask-introduction/