1. 介绍
Flask 是一个用 Python 编写的轻量级 Web 框架,由 Armin Ronacher 开发,基于 Werkzeug 工具箱和 Jinja2 模板引擎。Flask 的设计理念是“微框架”,即提供核心功能,其他功能通过扩展来实现。这使得 Flask 非常适合快速开发小型到中型的 Web 应用程序。
2. 工作流程
Flask 的工作流程可以概括为以下几步:
-
浏览器发送请求
用户通过浏览器向服务器发送请求,请求被发送到服务器监听的某个端口上的应用程序。 -
服务器接收请求
服务器程序接收到请求后,将请求转发给具体处理该请求的程序。 -
解析请求并执行处理函数
该程序解析请求,找到该请求对应的处理函数,并执行该函数。 -
返回响应
处理函数的返回值被返回给服务器软件,服务器软件再将返回值发送回浏览器。
3. 使用
3.1 安装
首先,需要安装 Flask。可以使用 pip
来安装 Flask:
pip install Flask
3.2 使用文档
Flask 的官方文档非常详细,提供了丰富的使用指南和示例。你可以访问以下链接查看文档:
3.3 HTTP 方法
HTTP 方法(请求方法)用于定义客户端与服务器之间的交互类型。常见的 HTTP 方法包括:
- GET:用于请求访问已经存在的资源,通常用于获取数据。
- POST:用于向服务器发送数据,通常用于提交表单或上传文件。
- PUT:用于更新服务器上的资源。
- DELETE:用于删除服务器上的资源。
- 其他方法:如 HEAD、OPTIONS、PATCH 等。
3.4 Flask 四步法
以下是使用 Flask 创建一个简单 Web 应用的基本步骤:
-
导入 Flask 模块
from flask import Flask, request, render_template, redirect, url_for
-
创建 Flask 应用实例
app = Flask(__name__)
-
定义路由及请求响应函数
@app.route('/') def index(): return 'Hello, World!' @app.route('/userinfo_submit', methods=['GET', 'POST']) def userinfo_submit(): if request.method == 'POST': # 处理 POST 请求 username = request.form['username'] email = request.form['email'] return f'User {username} with email {email} submitted successfully.' else: # 处理 GET 请求 return render_template('form.html')
-
启动服务并监听端口
if __name__ == '__main__': app.run(host='127.0.0.1', port=5000)
4. 高级用法
4.1 模板渲染
Flask 使用 Jinja2 模板引擎来渲染 HTML 页面。可以通过 render_template
函数来渲染模板文件。
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
name = 'John Doe'
return render_template('index.html', name=name)
在 templates
文件夹中创建 index.html
文件:
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
4.2 表单处理
Flask 可以轻松处理表单数据。以下是一个简单的表单处理示例:
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/form', methods=['GET', 'POST'])
def form():
if request.method == 'POST':
username = request.form['username']
email = request.form['email']
return f'User {username} with email {email} submitted successfully.'
return render_template('form.html')
在 templates
文件夹中创建 form.html
文件:
<!DOCTYPE html>
<html>
<head>
<title>Form</title>
</head>
<body>
<form method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="email">Email:</label>
<input type="email" id="email" name="email"><br><br>
<button type="submit">Submit</button>
</form>
</body>
</html>
4.3 数据库集成
Flask 可以与多种数据库集成,如 SQLite、MySQL、PostgreSQL 等。常用的 ORM 工具是 SQLAlchemy。
-
安装 SQLAlchemy
pip install Flask-SQLAlchemy
-
配置数据库
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) @app.route('/') def index(): users = User.query.all() return render_template('users.html', users=users) @app.route('/add_user', methods=['POST']) def add_user(): username = request.form['username'] email = request.form['email'] new_user = User(username=username, email=email) db.session.add(new_user) db.session.commit() return redirect(url_for('index')) if __name__ == '__main__': db.create_all() app.run(host='127.0.0.1', port=5000)
-
创建模板文件
在
templates
文件夹中创建users.html
文件:<!DOCTYPE html> <html> <head> <title>Users</title> </head> <body> <h1>Users</h1> <ul> {% for user in users %} <li>{{ user.username }} - {{ user.email }}</li> {% endfor %} </ul> <form method="post" action="/add_user"> <label for="username">Username:</label> <input type="text" id="username" name="username"><br><br> <label for="email">Email:</label> <input type="email" id="email" name="email"><br><br> <button type="submit">Add User</button> </form> </body> </html>
5. 模型部署案例:垃圾分类
假设我们有一个简单的垃圾分类模型,需要通过 Flask 部署为 Web 服务。以下是一个完整的示例:
-
安装必要的库
pip install Flask pip install tensorflow
-
创建 Flask 应用
from flask import Flask, request, jsonify import tensorflow as tf from PIL import Image import numpy as np # 加载预训练模型 model = tf.keras.models.load_model('path/to/your/model.h5') app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict(): if 'image' not in request.files: return jsonify({'error': 'No image uploaded'}), 400 file = request.files['image'] img = Image.open(file) img = img.resize((224, 224)) # 假设模型输入尺寸为 224x224 img_array = np.array(img) / 255.0 # 归一化 img_array = np.expand_dims(img_array, axis=0) # 增加 batch 维度 # 预测 predictions = model.predict(img_array) predicted_class = np.argmax(predictions, axis=1)[0] class_names = ['可回收物', '有害垃圾', '湿垃圾', '干垃圾'] result = {'predicted_class': class_names[predicted_class], 'confidence': float(predictions[0][predicted_class])} return jsonify(result) if __name__ == '__main__': app.run(host='127.0.0.1', port=5000)
-
运行应用
保存上述代码为
app.py
,然后在终端运行:python app.py
-
测试 API
你可以使用 Postman 或 curl 来测试 API。例如,使用 curl:
curl -X POST -F "image=@path/to/your/image.jpg" http://127.0.0.1:5000/predict
如果一切正常,你应该会看到模型的预测结果。
6. 总结
Flask 是一个非常灵活和强大的 Web 框架,适合快速开发和部署各种 Web 应用程序。通过上述步骤,你可以轻松地创建一个基本的 Flask 应用,并将其扩展为更复杂的功能,如模型部署。希望这些信息对你有所帮助!