Python 轻量级 Web 应用框架 Flask
Python 轻量级 Web 应用框架 Flask
flyfish
Flask 是一个用 Python 编写的轻量级 Web 应用框架,主要用于构建 Web 应用和 RESTful API。
简单的 Flask 应用示例:
from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)
使用 Flask 创建简单 RESTful API 的示例
from flask import Flask, jsonify, requestapp = Flask(__name__)# 假设有一个用户数据列表
users = [{'id': 1, 'name': 'Alice'},{'id': 2, 'name': 'Bob'},
]# 获取所有用户
@app.route('/users', methods=['GET'])
def get_users():return jsonify(users)# 获取特定用户
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):user = next((user for user in users if user['id'] == user_id), None)if user is None:return jsonify({'error': 'User not found'}), 404return jsonify(user)# 创建新用户
@app.route('/users', methods=['POST'])
def create_user():new_user = request.jsonusers.append(new_user)return jsonify(new_user), 201# 更新用户
@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):user = next((user for user in users if user['id'] == user_id), None)if user is None:return jsonify({'error': 'User not found'}), 404user.update(request.json)return jsonify(user)# 删除用户
@app.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):global usersusers = [user for user in users if user['id'] != user_id]return jsonify({'result': 'User deleted'})if __name__ == '__main__':app.run(debug=True)
创建新用户
请求类型 :POST
URL :http://localhost:5000/users
请求体类型 :JSON请求体内容 :
{"id": 3,"name": "Charlie"
}
更新用户
请求类型 :PUT
URL :http://localhost:5000/users/{id}
例如 http://localhost:5000/users/3
(假设更新 ID 为 3 的用户)。
请求体类型 :JSON请求体内容 :
{"name": "Charlie Updated"
}
解析 JSON 数据
Flask 提供了一个简单的方法来解析传入请求的 JSON 数据,可以通过 request.json
属性来访问。
定义了一个 POST 路由 /json
,用于接收 JSON 数据。使用 request.json
提取请求体中的 JSON 数据,并返回处理结果。
from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/json', methods=['POST'])
def parse_json():# 获取 JSON 数据data = request.json# 检查数据是否为空或解析失败if data is None:return jsonify({"error": "No JSON data received"}), 400# 访问 JSON 数据name = data.get('name')age = data.get('age')# 返回处理后的数据return jsonify({"message": f"Received data for {name}, age {age}."})if __name__ == '__main__':app.run(debug=True)
日志记录
Flask 使用 Python 的内置 logging
模块来处理日志记录。你可以配置日志记录的格式、级别和输出目的地。
配置日志
import logging
from flask import Flask, requestapp = Flask(__name__)# 配置日志记录
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)@app.route('/')
def home():# 记录一个信息日志logger.info('Home page accessed')return 'Welcome to the Home Page!'@app.route('/json', methods=['POST'])
def parse_json():try:data = request.jsonif data is None:logger.error('No JSON data received')return jsonify({"error": "No JSON data received"}), 400# 记录收到的 JSON 数据logger.info(f'Received JSON data: {data}')name = data.get('name')age = data.get('age')return jsonify({"message": f"Received data for {name}, age {age}."})except Exception as e:# 记录异常logger.exception('Error occurred while parsing JSON')return jsonify({"error": str(e)}), 500if __name__ == '__main__':app.run(debug=True)
日志级别
可以使用不同的日志级别来控制记录的详细程度:
DEBUG
: 详细的调试信息,通常用于开发。
INFO
: 常规信息,比如应用启动和停止。
WARNING
: 警告信息,表示某些异常情况。
ERROR
: 错误信息,表示有功能无法正常工作。
CRITICAL
: 严重错误,表示应用可能无法继续运行。
将日志输出到文件
你可以将日志输出到文件以便于长期记录和分析:
import logging
from logging.handlers import RotatingFileHandler# 创建日志处理器,将日志输出到文件
file_handler = RotatingFileHandler('app.log', maxBytes=10240, backupCount=10)
file_handler.setLevel(logging.INFO)# 设置日志格式
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')
file_handler.setFormatter(formatter)# 添加处理器到日志记录器
logger.addHandler(file_handler)
在上面的例子中,我们使用 RotatingFileHandler
来创建一个日志文件,最大文件大小为 10 KB,最多保留 10 个备份文件。可以根据需要调整这些参数。
处理JSON 格式
jsonify
是 Flask 提供的一个便捷函数,用于将 Python 数据结构转换为 JSON 格式,并创建一个包含 JSON 数据的响应对象。它自动设置了正确的 Content-Type
响应头,使得客户端可以识别响应中的数据为 JSON 格式。jsonify
的特点和优点
自动序列化 :jsonify
会将 Python 数据类型(如字典、列表等)转换为 JSON 字符串。
设置响应头 :它会自动将响应的 Content-Type
设置为 application/json
。
支持 Unicode :它能够正确处理 Unicode 字符串。
简化代码 :相比直接使用 json.dumps
和构建响应对象,jsonify
使代码更加简洁。
使用示例
以下是一个使用 jsonify
的简单示例:
from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/user')
def get_user():# 模拟用户数据user = {'id': 1,'name': 'Alice','email': 'alice@example.com'}# 使用 jsonify 创建 JSON 响应return jsonify(user)if __name__ == '__main__':app.run(debug=True)
在这个示例中,创建了一个 /user
路由,返回一个包含用户信息的 JSON 响应。jsonify
函数将 user
字典转换为 JSON 格式,并自动设置了响应头。与 json.dumps
的区别
jsonify
:直接创建 Flask 响应对象,并自动设置 Content-Type
头为 application/json
。
json.dumps
:将 Python 数据结构转换为 JSON 字符串,需要手动创建响应对象和设置响应头。
例如,使用 json.dumps
时,代码可能如下:
import json
from flask import Flask, Responseapp = Flask(__name__)@app.route('/user')
def get_user():user = {'id': 1,'name': 'Alice','email': 'alice@example.com'}# 使用 json.dumps 生成 JSON 字符串response = Response(json.dumps(user), mimetype='application/json')return responseif __name__ == '__main__':app.run(debug=True)
相比之下,jsonify
更加简洁和易用,尤其在构建返回 JSON 格式的响应时。因此,在 Flask 中推荐使用 jsonify
来处理 JSON 响应。
响应
在需要快速返回常见响应时(如 JSON 响应、字符串响应),使用 make_response
可以简化代码。
如果需要细粒度地控制响应头、状态码和内容,则可以直接使用 Response
对象。
Response
Response
对象Response
是 Flask 的基础响应对象,表示一个 HTTP 响应。允许完全控制响应的内容、状态码和头部信息。
from flask import Flask, Responseapp = Flask(__name__)@app.route('/')
def custom_response():# 创建一个自定义响应对象response = Response("Hello, World!", status=200, mimetype='text/plain')response.headers['Custom-Header'] = 'CustomValue'return responseif __name__ == '__main__':app.run(debug=True)
make_response
make_response
函数make_response
是一个方便的工厂函数,用于生成 Response
对象。它可以接受多种类型的输入(字符串、字典、元组、现有响应对象等)来创建响应。
from flask import Flask, make_response, jsonifyapp = Flask(__name__)@app.route('/')
def make_custom_response():# 创建一个 JSON 响应response_data = {'message': 'Hello, World!'}response = make_response(jsonify(response_data), 200)response.headers['Custom-Header'] = 'CustomValue'return responseif __name__ == '__main__':app.run(debug=True)
Response
提供了完整的控制,可以直接构建和修改响应对象。
Response
只能接受字符串或文件流作为主体内容。
make_response
提供了更简单的方法来创建响应,支持更灵活的输入类型。
make_response
可以接受字符串、元组、字典、现有 Response
对象等,并自动生成合适的响应对象。