当前位置: 首页 > news >正文

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
URLhttp://localhost:5000/users
请求体类型 :JSON请求体内容

{"id": 3,"name": "Charlie"
}

更新用户

请求类型 :PUT
URLhttp://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 对象等,并自动生成合适的响应对象。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 练习题 - 探索命名空间和作用域
  • 调试和优化大型深度学习模型 - 5 启动训练命令
  • 8.16-ansible的应用
  • 【区块链+金融服务】基于区块链的供应链金融系统 | FISCO BCOS应用案例
  • 主机ssh连接不上vmware的虚拟机
  • Java算法题——二分查找法
  • MemFire Cloud是否真的可以取代后端
  • 【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端
  • Token 设计
  • SpringBoot响应式编程(2)WebFlux入门
  • 文心快码(Baidu Comate)快速创建数据可视化图表
  • CSS的:host伪类:精确定位于Web组件的指南
  • 00_remipi_软件评估记录
  • 计算机基础知识复习8.13
  • 基于 HTTP构建 YUM网络源
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Bootstrap JS插件Alert源码分析
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • JavaScript创建对象的四种方式
  • mac修复ab及siege安装
  • NSTimer学习笔记
  • React 快速上手 - 07 前端路由 react-router
  • Redis在Web项目中的应用与实践
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 搭建gitbook 和 访问权限认证
  • 电商搜索引擎的架构设计和性能优化
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 回流、重绘及其优化
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 追踪解析 FutureTask 源码
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 积累各种好的链接
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​渐进式Web应用PWA的未来
  • # 计算机视觉入门
  • #{}和${}的区别?
  • #{}和${}的区别是什么 -- java面试
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八)Flink Join 连接
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)计算机毕业设计大学生兼职系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (南京观海微电子)——COF介绍
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)汇编语言——简单程序
  • (转)linux 命令大全
  • (转)大型网站的系统架构
  • .a文件和.so文件
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?