从零开始使用Flask快速构建你的第一个Python Web应用

举报
柠檬🍋 发表于 2024/09/07 00:15:03 2024/09/07
【摘要】 在当今的数字世界中,Web应用的开发已经成为软件工程师的基本技能之一。Flask,一个轻量级的Python Web框架,为开发者提供了一种简单且灵活的方式来快速构建Web应用。本文将带你从零开始,逐步构建你的第一个Flask Web应用,并深入探讨其中的关键概念和设计原则。 一、什么是Flask?Flask是一个轻量级的WSGI Web应用框架,由Python编写而成。它的设计哲学是“保持简...

在当今的数字世界中,Web应用的开发已经成为软件工程师的基本技能之一。Flask,一个轻量级的Python Web框架,为开发者提供了一种简单且灵活的方式来快速构建Web应用。本文将带你从零开始,逐步构建你的第一个Flask Web应用,并深入探讨其中的关键概念和设计原则。

一、什么是Flask?

Flask是一个轻量级的WSGI Web应用框架,由Python编写而成。它的设计哲学是“保持简单,但不简单”,即提供足够的灵活性以适应各种应用场景,而不过分复杂。Flask是微框架,意味着它不会强制你使用特定的工具或库,你可以根据项目的需要来决定使用哪些扩展包。

二、安装Flask

首先,你需要在本地环境中安装Flask。使用Python的包管理器pip来安装:

pip install Flask

确保你的Python版本在3.7以上,以保证兼容性。

三、构建你的第一个Flask应用

  1. 创建项目目录和文件

首先,创建一个项目目录并进入其中:

mkdir flask_app
cd flask_app

然后,在该目录中创建一个名为app.py的文件,这是我们Flask应用的入口点。

  1. 编写Flask应用代码

app.py文件中,编写以下代码:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Flask!"

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

这个简单的应用做了以下几件事:

  • 导入Flask模块:我们从flask库中导入了Flask类。
  • 创建Flask应用实例app = Flask(__name__)实例化了一个Flask应用。
  • 定义路由:使用@app.route('/')装饰器来定义URL路由,表示当访问根路径(/)时,将会调用home函数。
  • 启动应用app.run(debug=True)启动了Flask开发服务器,并启用调试模式。
  1. 运行应用

在终端中运行以下命令:

python app.py

如果一切顺利,你将会看到类似以下的输出:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 123-456-789

打开浏览器,访问http://127.0.0.1:5000/,你将会看到页面显示“Hello, Flask!”。

四、深入理解Flask的工作原理

Flask的核心在于其简单的路由系统。每当一个HTTP请求到达Flask应用时,Flask会根据请求的URL路径,匹配相应的路由,并执行相应的视图函数(如home函数)。

  • Flask应用的生命周期:Flask应用的生命周期包括启动、请求处理、响应生成和应用结束。理解这些生命周期有助于优化应用性能和调试复杂问题。
  • 上下文:Flask中有两种重要的上下文:应用上下文(Application Context)和请求上下文(Request Context)。应用上下文包含应用相关的配置信息,而请求上下文包含与当前请求相关的数据,如请求对象request和会话对象session

五、构建一个简单的表单应用

在理解了基本原理后,让我们进一步扩展我们的Flask应用,添加一个简单的表单功能。这个表单将允许用户输入他们的名字,并在提交后显示个性化的欢迎信息。

  1. 安装Flask-WTF

Flask-WTF是Flask的一个扩展,简化了Web表单的处理。首先,我们需要安装它:

pip install Flask-WTF
  1. 创建HTML表单模板

在项目目录中创建一个templates文件夹,并在其中创建一个名为form.html的文件,写入以下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flask Form</title>
</head>
<body>
    <h1>Enter your name:</h1>
    <form method="POST">
        {{ form.hidden_tag() }}
        {{ form.name.label }} {{ form.name(size=32) }} <br><br>
        {{ form.submit() }}
    </form>
</body>
</html>
  1. 创建表单类

app.py文件中,导入必要的模块并定义表单类:

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
app.config['SECRET_KEY'] = 'supersecretkey'

class NameForm(FlaskForm):
    name = StringField('Your Name', validators=[DataRequired()])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET', 'POST'])
def home():
    form = NameForm()
    if form.validate_on_submit():
        name = form.name.data
        return f'Hello, {name}!'
    return render_template('form.html', form=form)

if __name__ == '__main__':
    app.run(debug=True)
  • NameForm类:我们定义了一个继承自FlaskForm的表单类,包含一个字符串字段name和一个提交按钮submit
  • 渲染模板和处理表单数据:在home视图函数中,我们渲染了form.html模板,并传入表单实例form。当表单提交后,我们通过validate_on_submit方法验证表单数据,如果验证通过,将返回个性化的欢迎信息。
  1. 运行应用并测试

再次运行app.py,在浏览器中访问http://127.0.0.1:5000/,你将会看到一个简单的表单页面。输入你的名字并提交,页面将显示类似“Hello, [Your Name]!”的欢迎信息。

六、Flask扩展生态

Flask的设计非常模块化,允许开发者根据需求选择和添加扩展。以下是一些常用的Flask扩展:

  • Flask-SQLAlchemy:提供了SQLAlchemy ORM的集成,用于数据库操作。
  • Flask-Migrate:支持数据库迁移,适合在开发过程中管理数据库结构变化。
  • Flask-Login:用于用户认证和会话管理。
  • Flask-Mail:用于发送电子邮件。

这些扩展大大增强了Flask的功能,使得它在应对复杂应用时同样游刃有余。

七、集成数据库与Flask-SQLAlchemy

在现代Web应用中,持久化数据存储通常是不可或缺的。Flask-SQLAlchemy是一个强大的扩展,它将SQLAlchemy的ORM(对象关系映射)功能与Flask无缝集成,使得操作数据库变得直观且高效。在这一部分,我们将为Flask应用添加一个SQLite数据库,并展示如何通过Flask-SQLAlchemy进行数据库操作。

1. 安装Flask-SQLAlchemy

首先,我们需要安装Flask-SQLAlchemy扩展:

pip install Flask-SQLAlchemy

2. 配置和初始化数据库

app.py文件中,导入并配置Flask-SQLAlchemy:

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SECRET_KEY'] = 'supersecretkey'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
  • SQLALCHEMY_DATABASE_URI 配置了数据库的URI,这里我们使用SQLite数据库,并指定数据库文件为site.db
  • SQLALCHEMY_TRACK_MODIFICATIONS 选项用于关闭Flask-SQLAlchemy的事件系统,从而节省内存。

3. 定义数据模型

接下来,我们定义一个数据模型(数据库表)。假设我们想要在应用中保存用户信息,我们可以创建一个User模型:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    date_created = db.Column(db.DateTime, nullable=False, default=db.func.now())

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', '{self.date_created}')"

在这个模型中:

  • id 是主键,用于唯一标识每一个用户。
  • usernameemail 是字符串字段,并且必须是唯一的(unique=True),且不能为空(nullable=False)。
  • date_created 存储用户的创建时间,默认值为当前时间。

4. 创建数据库

在Python Shell中,我们可以使用以下命令创建数据库和表:

from app import db
db.create_all()

这将根据我们定义的模型在site.db中创建相应的表结构。

5. 操作数据库

我们可以通过Flask Shell直接操作数据库,添加、查询、更新和删除用户信息。

添加用户:

from app import db, User

user_1 = User(username='Alice', email='alice@example.com')
db.session.add(user_1)
db.session.commit()

查询用户:

all_users = User.query.all()  # 返回所有用户
user = User.query.filter_by(username='Alice').first()  # 查询特定用户

更新用户信息:

user = User.query.get(1)  # 获取ID为1的用户
user.email = 'alice_new@example.com'
db.session.commit()

删除用户:

db.session.delete(user)
db.session.commit()

6. 在视图中集成数据库操作

我们可以将数据库操作集成到Flask视图中。例如,创建一个注册页面,允许用户输入用户名和邮箱,并将其保存到数据库中:

模板register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Register</title>
</head>
<body>
    <h1>Register</h1>
    <form method="POST">
        {{ form.hidden_tag() }}
        {{ form.username.label }} {{ form.username(size=32) }} <br><br>
        {{ form.email.label }} {{ form.email(size=32) }} <br><br>
        {{ form.submit() }}
    </form>
</body>
</html>

更新app.py

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Email

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    submit = SubmitField('Register')

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        user = User(username=form.username.data, email=form.email.data)
        db.session.add(user)
        db.session.commit()
        return f"User {form.username.data} has been registered!"
    return render_template('register.html', form=form)
  • 注册表单RegistrationForm继承自FlaskForm,并包含usernameemail字段,以及提交按钮。
  • 注册视图:在/register路由中,处理表单提交,并将用户信息保存到数据库。如果成功,将显示确认信息。

八、创建RESTful API

随着Web应用的复杂化,你可能需要为前端或第三方服务提供API接口。Flask可以通过路由和视图函数轻松实现RESTful API。

  1. 创建API端点

假设我们想要提供一个简单的用户API,可以创建一个新的路由来返回用户列表:

from flask import jsonify

@app.route('/api/users', methods=['GET'])
def get_users():
    users = User.query.all()
    return jsonify([{'username': user.username, 'email': user.email} for user in users])

这里我们使用了jsonify函数,将用户数据转换为JSON格式,并返回给客户端。访问/api/users端点,你将获得所有用户的列表。

  1. 创建单个用户查询端点

我们可以进一步扩展API,允许通过用户ID查询单个用户的信息:

@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = User.query.get_or_404(user_id)
    return jsonify({'username': user.username, 'email': user.email})
  • <int:user_id> 是路由中的路径参数,用于动态获取特定用户的ID。
  • get_or_404 方法在用户不存在时会自动返回404错误,这符合RESTful API的设计原则。
  1. 实现创建、更新和删除API端点

接下来,我们可以实现RESTful API的完整操作,包括创建、更新和删除用户。以下是这些操作的简单实现:

创建用户:

@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.get_json()
    new_user = User(username=data['username'], email=data['email'])
    db.session.add(new_user)
    db.session.commit()
    return jsonify({'message': 'User created successfully!'}), 201

更新用户:

@app.route('/api/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
    user = User.query.get_or_404(user_id)
    data = request.get_json()
    user.username = data['username']
    user.email = data['email']
    db.session.commit()
    return jsonify({'message': 'User updated successfully!'})

删除用户:

@app.route('/api/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):
    user = User.query.get_or_404(user_id)
    db.session.delete(user)
    db.session.commit()
    return jsonify({'message': 'User deleted successfully!'})

九、实现用户认证与授权

在大多数Web应用中,用户认证与授权是核心功能。Flask-Login是一个简单易用的扩展,帮助开发者实现用户登录、登出、访问控制等功能。

  1. 安装Flask-Login

首先,我们需要安装Flask-Login扩展:

pip install Flask-Login
  1. 配置用户加载器

app.py中,配置Flask-Login,并定义用户加载器:

from flask_login import LoginManager, UserMixin, login_user, logout_user, current_user, login_required

login_manager = LoginManager(app)
login_manager.login_view = 'login'

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

这里,我们将User类继承自UserMixin,这是Flask-Login提供的一个帮助类,它为用户模型添加了认证所需的属性和方法。

  1. 实现登录与登出功能

更新User模型:

class User(db.Model, UserMixin):
    # 其他字段保持不变
    password = db.Column(db.String(60), nullable=False)

创建登录表单和视图:

from flask_wtf import FlaskForm
from wtforms import PasswordField
from werkzeug.security import generate_password_hash, check_password_hash

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit =

 SubmitField('Login')

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user and check_password_hash(user.password, form.password.data):
            login_user(user)
            return f"Welcome {user.username}!"
    return render_template('login.html', form=form)
  • generate_password_hash 用于生成用户密码的哈希值,并存储在数据库中。
  • check_password_hash 用于在用户登录时验证密码。

实现登出功能:

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('home'))

保护路由:

通过Flask-Login,你可以轻松地保护路由,确保只有经过认证的用户才能访问某些页面:

@app.route('/dashboard')
@login_required
def dashboard():
    return f"Hello, {current_user.username}! Welcome to your dashboard."

通过在路由函数上添加@login_required装饰器,未经认证的用户将被重定向到登录页面。

84f571cae78b4d9098da25990dd2e36.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。