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

【Python】使用flask作为web服务器

一、flash轻量级web框架介绍

Python Flask 框架是一个轻量级的 Web 框架,它简单易用,灵活多变,非常适合用于构建小型到中型规模的 Web 应用程序。以下是 Flask 框架的详细介绍:

1、基本概念

Flask 是一个基于 Python 的微型 Web 开发框架,主要面向小型应用和开发初期需求简单的项目。相比于 Django 这种重量级的框架,Flask 更加轻量级,易于使用和部署。它提供了基本的路由、模板渲染、错误处理等 Web 开发的核心功能,但保持了足够的灵活性,允许开发者根据需要选择和添加其他库来扩展功能。

2、主要特点

  1. 轻量级:Flask 保持核心功能简单,易于理解和使用。这使得 Flask 成为一个非常适合快速开发和迭代的框架。
  2. 灵活性:Flask 不强制使用特定的库或工具,开发者可以根据自己的需求选择适合的组件。例如,可以使用不同的数据库、模板引擎等。
  3. 可扩展性:虽然 Flask 本身功能简单,但它提供了丰富的扩展接口。开发者可以通过安装 Flask 扩展来添加各种功能,如数据库支持、表单处理、安全性等。
  4. 强大的社区支持:Flask 有一个活跃的社区,提供了大量的教程、示例代码和第三方库。这使得开发者在遇到问题时能够迅速找到解决方案。

3、核心组件

  1. 路由系统:Flask 通过装饰器 @app.route() 定义路由规则,将 URL 映射到相应的处理函数。这使得路由的定义非常直观和简洁。
  2. 模板引擎:Flask 默认使用 Jinja2 模板引擎进行 HTML 渲染。Jinja2 提供了丰富的模板标签和过滤器,使得动态生成 HTML 页面变得简单高效。
  3. 请求上下文:Flask 通过请求上下文(request context)来处理 HTTP 请求。开发者可以从请求上下文中获取请求数据,如查询参数、表单数据等。
  4. 响应对象:Flask 允许开发者通过响应对象(response object)自定义 HTTP 响应。可以设置状态码、响应头、响应体等内容。
  5. 错误处理:Flask 提供了强大的错误处理机制。开发者可以定义错误处理器来处理不同类型的 HTTP 错误,如 404(页面未找到)和 500(服务器内部错误)等。
  6. 会话管理:Flask 支持基于 cookie 的会话管理。开发者可以轻松地在会话中存储和检索数据,实现用户状态的跟踪和管理。

4、扩展与生态

Flask 的生态系统非常丰富,有大量第三方扩展可供选择。以下是一些常用的 Flask 扩展:

  1. Flask-SQLAlchemy:为 Flask 提供了 ORM(对象关系映射)支持,使得开发者能够更方便地操作数据库。
  2. Flask-WTF:提供了表单处理功能,包括表单验证、CSRF 保护等。
  3. Flask-Login:用于处理用户登录和权限验证。
  4. Flask-Migrate:提供了数据库迁移功能,便于管理数据库模式的变更。
  5. Flask-Mail:用于发送电子邮件。
  6. Flask-Babel:支持国际化,使得开发者可以轻松地实现多语言应用。

5、总结

Flask 框架以其轻量级、灵活性和可扩展性著称,非常适合用于构建小型到中型规模的 Web 应用程序。它提供了基本的 Web 开发功能,并允许开发者根据需要选择和添加其他库来扩展功能。Flask 强大的社区支持和丰富的生态系统使得开发者能够轻松地找到解决问题的方法和工具。

二、使用代码示例

以下是一个简单的 Flask 应用程序的代码示例,它涵盖了基本的路由、模板渲染和简单的表单处理。

首先,确保你已经安装了 Flask。如果没有,请通过运行以下命令进行安装:

pip install Flask

然后,你可以创建一个简单的 Flask 应用程序,如下所示:

# 导入 Flask 类
from flask import Flask, render_template, request# 创建 Flask 应用实例
app = Flask(__name__)# 定义一个简单的路由和处理函数
@app.route('/')
def hello_world():return 'Hello, World!'# 定义一个带参数的路由
@app.route('/greet/<name>')
def greet(name):return f'Hello, {name}!'# 定义一个用于处理 POST 请求的路由,用于接收表单数据
@app.route('/submit', methods=['GET', 'POST'])
def submit():if request.method == 'POST':name = request.form.get('name')return f'Hello, {name}! Your form has been submitted.'return render_template('form.html')# 如果你的应用程序有一个名为 'templates' 的文件夹,并在其中有一个 'form.html' 文件,
# Flask 会自动从该文件夹中加载模板。# 启动 Flask 开发服务器,默认端口5000
# 可以增加参数 port 来指定端口
if __name__ == '__main__':app.run(debug=True)# app.run(debug=True, port=8088)

接下来,创建一个名为 templates 的文件夹,并在其中创建一个名为 form.html 的 HTML 模板文件,内容如下:

<!DOCTYPE html>
<html>
<head><title>Flask Form Example</title>
</head>
<body><h1>Submit Your Name</h1><form method="POST" action="/submit"><input type="text" name="name" placeholder="Your name"><input type="submit" value="Submit"></form>
</body>
</html>

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

  1. 当用户访问根 URL (/) 时,它会返回一个简单的 “Hello, World!” 字符串。
  2. 当用户访问 /greet/<name> URL 时,它会返回一个个性化的问候语,其中 <name> 是用户提供的名字。
  3. 当用户访问 /submit URL 时,如果是 GET 请求,它会显示一个包含表单的 HTML 页面。用户可以在表单中输入他们的名字,并提交表单。如果是 POST 请求(即用户提交了表单),它会读取表单中的名字,并返回一个包含该名字的问候语。

要运行此应用程序,请将上述 Python 代码保存为 app.py(或其他你喜欢的文件名),然后在命令行中运行以下命令:

python app.py

这将启动 Flask 的开发服务器,并监听默认的 127.0.0.1:5000 地址。你可以通过浏览器访问 http://127.0.0.1:5000/ 来查看应用程序。

三、使用jsonify make_response返回 json 数据

jsonifymake_response 都是 Flask 框架中用于创建 HTTP 响应的工具,但它们在使用和功能上有一些区别。

jsonify

jsonify 是一个便捷函数,专门用于生成 JSON 响应。当你需要将数据以 JSON 格式返回给客户端时,使用 jsonify 非常方便。它会自动将数据转换为 JSON 格式,并设置正确的 Content-Typeapplication/json。此外,jsonify 还允许你添加额外的 HTTP 头部或状态码。

示例:

from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/data', methods=['GET'])
def get_data():data = {'key': 'value'}return jsonify(data), 200  # 返回 JSON 响应和状态码 200

make_response

make_response 是一个更通用的函数,用于创建一个响应对象。你可以使用它来创建任何类型的响应,不仅仅是 JSON。通过 make_response,你可以设置响应体、状态码、头部信息等。如果你需要更多的控制或需要创建非 JSON 响应,make_response 是一个好选择。

示例:

from flask import Flask, make_responseapp = Flask(__name__)
# 默认情况下,Flask会在应用的templates文件夹中查找模板文件
# 可以增加参数指定模板目录
# app = Flask(__name__, template_folder='my_templates')@app.route('/text', methods=['GET'])
def get_text():response = make_response('Hello, World!')response.headers['Content-Type'] = 'text/plain'return response

区别总结

  1. 专用性与通用性jsonify 专门用于创建 JSON 响应,而 make_response 可以用于创建任何类型的 HTTP 响应。
  2. 便捷性:当你需要快速返回一个 JSON 响应时,jsonify 提供了更简洁的语法。而 make_response 需要你手动设置响应体和头部信息。
  3. 自动转换jsonify 会自动将数据转换为 JSON 格式,并设置正确的 Content-Type 头部。而使用 make_response 时,你需要自己处理这些转换和设置。
  4. 灵活性:虽然 jsonify 在处理 JSON 响应时非常方便,但如果你需要创建其他类型的响应或需要更多的控制(如自定义头部、设置 cookies 等),make_response 会更加灵活。

在选择使用 jsonify 还是 make_response 时,主要考虑你的具体需求和响应类型。如果你只是需要返回一个简单的 JSON 响应,那么 jsonify 通常是更好的选择。如果你需要更多的自定义或控制,或者需要返回非 JSON 响应,那么 make_response 会更合适。

四、日志打印

在 Flask 中,app.logger 是一个预配置的日志记录器,你可以使用它来记录应用程序的日志。默认情况下,app.logger 将日志输出到控制台。如果你希望将日志记录到文件中,你需要对日志处理器(handler)和格式化器(formatter)进行配置。

以下是一个示例,展示了如何在 Flask 应用程序中将日志记录到文件中:

from flask import Flask
import logging
from logging.handlers import RotatingFileHandlerapp = Flask(__name__)# 配置日志记录器
handler = RotatingFileHandler('app.log', maxBytes=1024 * 1024, backupCount=5)  # 创建一个日志文件,最大1MB,备份5个
handler.setLevel(logging.INFO)  # 设置日志级别为 INFO
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 设置日志格式
handler.setFormatter(formatter)  # 为处理器设置格式化器app.logger.addHandler(handler)  # 将处理器添加到 Flask 的日志记录器中
app.logger.setLevel(logging.INFO)  # 设置 Flask 日志记录器的级别为 INFO@app.route('/')
def index():app.logger.info('This is an info message')app.logger.warning('This is a warning message')return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

在这个示例中,我们使用了 RotatingFileHandler,它将日志记录到一个文件中,并且当文件达到一定大小时会自动分割和备份。我们设置了日志文件的最大大小为 1MB,并保留 5 个备份文件。日志级别设置为 INFO,这意味着将记录 INFO 级别及以上的日志。我们还定义了一个日志格式,包括时间戳、记录器名称、日志级别和日志消息。最后,我们将这个处理器添加到 Flask 的日志记录器中,并设置了日志级别。

现在,当你运行 Flask 应用程序并访问根路由时,你应该会在名为 app.log 的日志文件中看到相应的日志记录。

参考

  • 中文官网
  • Jinja2模板

相关文章:

  • “薅羊毛”到被“割韭菜”,警惕网络副业陷井
  • 基于电荷的EPFL HEMT模型
  • 使用Ollama+OpenWebUI本地部署Gemma谷歌AI开放大模型完整指南
  • 【论文速读 | USENIX Security‘2022】Debloating Address Sanitizer
  • Python下载库
  • unity中常见的角色控制方法
  • 十种排序算法的python实现
  • 把qml程序制作成安装包(Windows)
  • C++查看编译后的代码
  • Springboot jar运行时,将jar内的文件拷贝到文件系统中
  • hot100经典:困难 Leetcode 4. 寻找两个正序数组的中位数
  • C++ 20新特性之三向比较运算符
  • UG数控编程入门:从基础到精通的全方位指南
  • 一个 python+tensorFlow训练1万张图片分类的简单直观例子( 回答由百度 AI 给出 )
  • 呆滞物料规范管理了,问题就好办了
  • [译] 怎样写一个基础的编译器
  • 2019年如何成为全栈工程师?
  • ECS应用管理最佳实践
  • Java 23种设计模式 之单例模式 7种实现方式
  • Linux中的硬链接与软链接
  • React中的“虫洞”——Context
  • SpingCloudBus整合RabbitMQ
  • spring boot 整合mybatis 无法输出sql的问题
  • SQLServer之创建显式事务
  • 关于extract.autodesk.io的一些说明
  • 基于游标的分页接口实现
  • 记一次和乔布斯合作最难忘的经历
  • 让你的分享飞起来——极光推出社会化分享组件
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​学习一下,什么是预包装食品?​
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #define,static,const,三种常量的区别
  • (day18) leetcode 204.计数质数
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (独孤九剑)--文件系统
  • (区间dp) (经典例题) 石子合并
  • (一)插入排序
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net mvc 获取url中controller和action
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net/c# memcached 获取所有缓存键(keys)
  • .NetCore发布到IIS
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET周刊【7月第4期 2024-07-28】
  • @Autowired 与@Resource的区别
  • @media screen 针对不同移动设备
  • @RunWith注解作用
  • @SuppressWarnings(unchecked)代码的作用
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪