百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

使用 Flask 构建 Web 应用程序:完整实战教程

wptr33 2025-04-24 09:21 15 浏览

Flask 是一个用 Python 编写的 Web 应用程序框架。它被设计成灵活和易于扩展,让开发人员能够快速构建出高性能的 Web 应用程序。在这里,我们将介绍如何使用 Flask 构建一个完整的 Web 应用程序,包括使用 Flask-RESTful 构建 RESTful API、使用 Flask-SQLAlchemy 进行数据库操作、使用 Flask-wtf 进行表单验证和使用 Flask-JWT 进行身份认证和授权。

1. 使用 Flask 构建 Web 应用程序

首先,我们需要安装 Flask。可以使用 pip 命令进行安装:

pip install flask

在我们开始构建应用程序之前,我们需要导入 Flask:

from flask import Flask

接下来,我们需要创建一个 Flask 应用程序实例:

app = Flask(__name__)

现在我们可以开始定义路由了。路由是 Web 应用程序中用于处理 HTTP 请求的函数。我们可以使用 @app.route() 装饰器来定义路由:

@app.route('/')
def hello_world():
    return 'Hello, World!'

在这个例子中,我们定义了一个路由 /,当用户访问这个路由时,hello_world 函数会被调用,然后它会返回一个字符串 Hello, World!。我们可以通过运行以下命令来启动这个应用程序:

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

这个命令会启动一个本地服务器,并且会监听 http://127.0.0.1:5000/ 这个地址。现在,如果我们在浏览器中访问这个地址,我们就可以看到 Hello, World! 这个字符串了。

2. 使用 Flask-RESTful 构建 RESTful API

Flask-RESTful 是一个为 Flask 提供 RESTful API 支持的扩展。它可以让我们更轻松地构建出符合 RESTful API 规范的 API。

我们可以使用 pip 命令进行安装:

pip install flask-restful

在使用 Flask-RESTful 之前,我们需要先导入它:

from flask_restful import Resource, Api

然后,我们需要创建一个 API 实例:

api = Api(app)

现在我们可以开始定义 RESTful API 了。我们可以通过继承 Resource 类来定义一个资源,然后将这个资源注册到 API 实例中。

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/hello')

在这个例子中,我们定义了一个名为 HelloWorld 的资源,它支持 GET 请求,并且返回一个 JSON 格式的数据 {'hello': 'world'}。我们可以通过访问 /hello 这个路由来获取这个数据。

3. 使用 Flask-SQLAlchemy 进行数据库操作

Flask-SQLAlchemy 是一个为 Flask 提供 SQL 数据库支持的扩展。它可以让我们更轻松地使用 SQL 数据库进行数据存储和查询。

我们可以使用 pip 命令进行安装:

pip install flask-sqlalchemy

在使用 Flask-SQLAlchemy 之前,我们需要先导入它:

from flask_sqlalchemy import SQLAlchemy

然后,我们需要创建一个 SQLAlchemy 实例:

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

在这个例子中,我们配置了一个 SQLite 数据库,文件名为 example.db。

现在我们可以开始定义模型了。模型是指数据库中的表结构,它用于存储数据和进行查询。我们可以通过继承 db.Model 类来定义一个模型。

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

在这个例子中,我们定义了一个名为 User 的模型,它有一个 id 字段、一个 name 字段和一个 email 字段。id 字段是主键,并且它是一个自增的整数。name 字段和 email 字段分别是一个字符串类型,长度分别为 80 和 120,它们都不能为空,并且 email 字段必须是唯一的。

现在我们可以通过这个模型来进行数据操作了。例如,我们可以通过以下代码来添加一个新的用户:

user = User(name='John', email='john@example.com')
db.session.add(user)
db.session.commit()

这个代码会创建一个名为 John 的用户,并将它保存到数据库中。

4. 使用 Flask-WTF 进行表单验证

Flask-wtf 是一个为 Flask 提供表单验证支持的扩展。它可以让我们更轻松地进行表单验证和错误处理。

我们可以使用 pip 命令进行安装:

pip install flask-wtf

在使用 Flask-wtf 之前,我们需要先导入它:

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

然后,我们需要创建一个表单类:

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = StringField('Password', validators=[DataRequired()])
    submit = SubmitField('Login')

在这个例子中,我们定义了一个名为 LoginForm 的表单类,它有一个 username 字段、一个 password 字段和一个 submit 字段。username 字段和 password 字段都是字符串类型,并且不能为空。submit 字段是一个提交按钮。

现在我们可以在路由函数中使用这个表单了:


@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        # 处理表单提交的数据
        username = form.username.data
        password = form.password.data
        # 进行身份认证
        if authenticate(username, password):
            # 如果认证成功,将用户保存到 session 中
            session['username'] = username
            # 跳转到首页
            return redirect(url_for('index'))
        else:
            # 如果认证失败,显示错误信息
            flash('Invalid username or password')
    # 渲染表单页面
    return render_template('login.html', form=form)

在这个例子中,我们定义了一个名为 login 的路由函数,它处理 GET 和 POST 请求。在 GET 请求中,它渲染一个名为 login.html 的模板,并将 LoginForm 类传递给模板。在 POST 请求中,它首先验证表单数据是否合法,如果合法,则进行身份认证,如果认证成功,则将用户保存到 session 中,并跳转到首页;如果认证失败,则显示错误信息。

5. 使用 Flask-JWT 进行身份认证和授权

Flask-JWT 是一个为 Flask 提供身份认证和授权支持的扩展。它可以让我们更轻松地进行用户认证和权限控制。

我们可以使用 pip 命令进行安装:

pip install flask-jwt

在使用 Flask-JWT 之前,我们需要先导入它:

from flask_jwt import JWT, jwt_required, current_identity
from werkzeug.security import safe_str_cmp

然后,我们需要定义一个认证函数和一个回调函数:

def authenticate(username, password):
    user = User.query.filter_by(username=username).first()
    if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')):
        return user

def identity(payload):
    user_id = payload['identity']
    return User.query.get(user_id)

在这个例子中,我们定义了一个名为 authenticate 的认证函数和一个名为 identity 的回调函数。认证函数接收一个用户名和密码,然后在数据库中查找用户,如果用户存在并且密码正确,则返回该用户;否则返回 None。回调函数接收一个 JWT 载荷,然后根据载荷中的用户 ID 查找用户,并返回该用户。

现在我们可以使用这些函数来配置 JWT:

app.config['JWT_SECRET_KEY'] = 'secret'
jwt = JWT(app, authenticate, identity)

在这个例子中,我们配置了一个 JWT 密钥,然后创建了一个 JWT 实例。

现在我们可以在路由函数中使用 jwt_required 装饰器来限制访问权限:

@app.route('/protected')
@jwt_required()
def protected():
    return f'Hello, {current_identity.username}!'

在这个例子中,我们定义了一个名为 protected 的路由函数,并使用 jwt_required 装饰器限制了访问权限。如果用户未登录或者 JWT 验证失败,则会返回一个错误响应;如果验证成功,则可以在函数中访问 current_identity 对象来获取当前用户的信息。

完整的代码示例:

from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
from werkzeug.security import generate_password_hash, check_password_hash
from flask_jwt import JWT, jwt_required, current_identity
from datetime import timedelta

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'secret'
app.config['JWT_AUTH_URL_RULE'] = '/login'
app.config['JWT_EXPIRATION_DELTA'] = timedelta(hours=1)
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)
    password = db.Column(db.String(120), nullable=False)

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Log In')

def authenticate(username, password):
    user = User.query.filter_by(username=username).first()
    if user and check_password_hash(user.password, password):
        return user

def identity(payload):
    user_id = payload['identity']
    return User.query.get(user_id)

app.config['JWT_SECRET_KEY'] = 'secret'
jwt = JWT(app, authenticate, identity)

@app.route('/')
def index():
    return 'Hello, World!'

@app.route('/protected')
@jwt_required()
def protected():
    return f'Hello, {current_identity.username}!'

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

@app.route('/users', methods=['POST'])
def create_user():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')
    if not username or not password:
        return jsonify({'error': 'username and password are required'}), 400
    user = User.query.filter_by(username=username).first()
    if user:
        return jsonify({'error': 'username already exists'}), 400
    user = User(username=username, password=generate_password_hash(password))
    db.session.add(user)
    db.session.commit()
    return jsonify({'id': user.id, 'username': user.username}), 201

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

在这个例子中,我们定义了一个名为 User 的模型类,并在数据库中创建了一个名为 example.db 的 SQLite 数据库。我们还定义了一个名为 LoginForm 的表单类,用于验证用户登录表单的数据。

我们使用 Flask-JWT 实现了身份认证和授权功能,使用了 jwt_required 装饰器来限制访问权限。我们还实现了两个 API:/users 和 /protected。/users API 支持 GET 和 POST 方法,用于获取所有用户信息和创建新用户。/protected API 仅支持 GET 方法,用于演示如何使用 JWT 认证和授权功能保护 API。

在我们的应用程序中,我们使用 Flask-SQLAlchemy 进行数据库操作,使用 Flask-wtf 进行表单验证。这些扩展都是 Flask 生态系统中非常流行的扩展,可以让我们轻松地创建和操作 Web 应用程序。

值得注意的是,我们在应用程序中使用了 Flask-JWT 进行身份认证和授权,JWT 是一种轻量级的身份验证和授权方案,可以很容易地实现基于 token 的身份验证和授权。在我们的应用程序中,我们使用 JWT 生成 token,并使用 jwt_required 装饰器限制了访问权限。在实际的应用程序中,您可以根据需要调整 JWT 的配置,并根据实际需求来限制访问权限。

在编写 Flask 应用程序时,您还可以使用其他的 Flask 扩展来扩展应用程序的功能。例如,您可以使用 Flask-Mail 扩展来发送电子邮件,使用 Flask-Admin 扩展来创建管理员界面等等。在选择扩展时,建议选择流行度较高、维护活跃的扩展,并根据实际需求进行选择。

希望这个示例可以帮助您更好地理解如何使用 Flask 构建 Web 应用程序,并使用一些流行的扩展来扩展应用程序的功能。如果您有任何疑问或建议,请随时在评论中留言,我会尽力回答您的问题。

每天坚持学习一点点,不求有回报,只愿可以丰富自己!!!

相关推荐

每天一个编程技巧!掌握这7个神技,代码效率飙升200%

“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...

Git重置到某个历史节点(Sourcetree工具)

前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...

git工作区、暂存区、本地仓库、远程仓库的区别和联系

很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...

解锁人生新剧本的密钥:学会让往事退场

开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...

Reset local repository branch to be just like remote repository HEAD

技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...

Git恢复至之前版本(git恢复到pull之前的版本)

让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...

如何将文件重置或回退到特定版本(怎么让文件回到初始状态)

技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...

git如何正确回滚代码(git命令回滚代码)

方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...

[git]撤销的相关命令:reset、revert、checkout

基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...

利用shell脚本将Mysql错误日志保存到数据库中

说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...

MySQL 9.3 引入增强的JavaScript支持

MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...

python 连接 mysql 数据库(python连接MySQL数据库案例)

用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...

mysql导入导出命令(mysql 导入命令)

mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库  mysqldump-u用户名-p数据库名>导出的文件名  mysqldump-uw...

MySQL-SQL介绍(mysql sqlyog)

介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...