跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 编写简易 Web 应用框架实战指南

基于 WSGI 标准使用 Python 编写简易 Web 应用框架的方法。文章首先对比了不同 WSGI 服务器如 uWSGI 和 Waitress,详细讲解了 uWSGI 的安装、配置及常用参数。随后通过编写符合 WSGI 规范的 Demo 应用,演示了如何构建基础路由框架,实现了请求路径匹配、函数调用及 404 错误处理。最后整合框架与业务逻辑,展示了完整的启动流程与测试方法,帮助开发者理解 Web 框架底层原理。

信号故障发布于 2025/2/6更新于 2026/9/1058 浏览
Python 编写简易 Web 应用框架实战指南

Python 编写简易 Web 应用框架实战指南

写应用框架需要写底层服务器吗?

开发 Web 应用框架时,是否需要自己实现底层服务器取决于是否遵循标准。如果应用框架不参考 WSGI (Web Server Gateway Interface) 标准,那么确实需要定义一套属于自己的服务器协议。但这种方式通常不必要,专业的事情应该交给专业的工具来做。

我们将编写符合 WSGI 标准的框架,因此只需要引入符合该标准的服务器即可。

常见的 WSGI 服务器

  1. uWSGI:使用 C 语言编写的应用程序容器,具有广泛的应用场景。除了支持 WSGI 外,还支持 HTTP、WebSocket 等协议。它提供了多进程、多线程、协程、异步 IO 等多种运行模式,并支持内存共享、定时任务、快速热部署等高级功能。
  2. Waitress:纯 Python 编写的轻量级、可靠且支持多线程的 WSGI 服务器,适合运行 Python Web 应用。

本文将以 uWSGI 为例进行讲解。

uWSGI 基本使用

安装 uWSGI

在 Python 环境中,直接使用 pip 安装即可:

pip3 install uwsgi

配置 uWSGI

uWSGI 支持多种配置方式,可以直接在命令行指定参数,也可以写入配置文件。

命令行启动示例
uwsgi --http :8080 --wsgi-file myapp.py --callable app
配置文件启动

可以将上述命令写入 myapp.ini 文件中:

[uwsgi]
http = :8080
wsgi-file = myapp.py
callable = app

然后通过以下命令加载配置启动:

uwsgi --ini myapp.ini

此外,uWSGI 还支持 XML、YAML、JSON 等格式,甚至可以通过 URL 读取配置文件。

uWSGI 常用配置项

  • 指定启动用户和用户组

    uid=root
    gid=root
    

    生产环境建议不要使用 root 运行,应创建专用用户。

  • 指定项目名称

    project=myproject
    
  • 设置进程数 需要先开启 master 进程,再设置 worker 数量。一般建议进程数不超过 CPU 核数。

    master=True
    process=4
    
  • 设置对外 HTTP 地址 若需监听所有网卡,可设置为 0.0.0.0。

    http=0.0.0.0:8000
    

启服和停服

启动服务器

直接运行命令或加载配置文件:

uwsgi --http :8080
# 或
uwsgi -ini app.ini

关闭服务器

通过向进程发送信号来关闭,对应的信号为 SIGINT (即 kill -2)。

kill -2 <uwsgi_pid>

启动一个 Demo

首先编写一个符合 WSGI 标准的应用程序。WSGI 接口要求应用接收两个参数:environ (字典,包含请求信息) 和 start_response (函数,用于设置响应状态和头)。

def application(environ, start_response):
    status = "200 OK"
    headers = [("Content-type", "text/html")]
    start_response(status, headers)
    return [b'Hello, World.']

将上述代码保存为 main.py,使用 uWSGI 启动:

uwsgi --http :8080 --wsgi-file main.py

启动后,可以使用 curl 测试:

curl -v 127.0.0.1:8080/

写一个简单的 Web 应用框架

基于 WSGI 标准,我们可以封装一个更简单的路由框架,将业务逻辑与服务器解耦。

框架核心代码

创建一个 myWeb.py 文件作为框架核心:

webRoute = {}

def application(environ, start_response):
    path = environ.get('PATH_INFO', '/')

    if path in webRoute:
        func = webRoute[path]
        # 调用业务函数,传入 environ
        code, body = func(environ)

        status = "%d OK" % (code)
        headers = [("Content-type", "text/html")]
        start_response(status, headers)
        return [body.encode()]
    else:
        # 处理 404 错误
        status = "404 Not Found"
        headers = [("Content-type", "text/plain")]
        start_response(status, headers)
        return [b"Page not found"]

def Routes(path, func):
    print("add routes: %s %s" % (path, func))
    webRoute[path] = func

代码解析:

  1. 使用字典 webRoute 存储路由映射关系,Key 为 URL 路径,Value 为处理函数。
  2. application 函数是 WSGI 入口,获取请求路径并在字典中匹配。
  3. 若匹配成功,执行对应函数并根据返回值组合响应;若未匹配,返回 404。
  4. Routes 装饰器或辅助函数用于注册路由。

业务逻辑代码

创建 main.py 文件,引用框架并定义具体业务:

import myWeb

# 定义应用入口
app = myWeb.application

def index(environ):
    return (200, "hello world")

def api_data(environ):
    return (200, "api response data")

# 注册路由
myWeb.Routes("/index", index)
myWeb.Routes("/api", api_data)

运行框架

使用 uWSGI 启动我们编写的框架应用:

uwsgi --http :8080 --wsgi-file main.py --callable app

注意新增的配置项 --callable app,因为我们的入口函数名定义为 app 而不是默认的 application,所以需要显式指定。

启动后观察日志,可以看到路由注册信息:

add routes: /index <function index at ...>
add routes: /api <function api_data at ...>

验证请求:

curl http://127.0.0.1:8080/index
# 输出:hello world

curl http://127.0.0.1:8080/api
# 输出:api response data

curl http://127.0.0.1:8080/notfound
# 输出:Page not found

总结

本文介绍了基于 WSGI 标准使用 Python 编写简易 Web 应用框架的方法。通过理解 WSGI 接口规范(environ 和 start_response),我们可以将 Web 应用与底层服务器解耦。利用 uWSGI 作为服务器,配合自定义的路由框架,能够快速构建轻量级的 Web 服务。这种模式不仅适用于学习,也是理解 Flask、Django 等成熟框架底层原理的基础。

在实际生产中,建议结合 Gunicorn、Nginx 反向代理以及数据库连接池等组件,以构建高可用、高性能的 Web 系统。

目录

  1. Python 编写简易 Web 应用框架实战指南
  2. 写应用框架需要写底层服务器吗?
  3. 常见的 WSGI 服务器
  4. uWSGI 基本使用
  5. 安装 uWSGI
  6. 配置 uWSGI
  7. 命令行启动示例
  8. 配置文件启动
  9. uWSGI 常用配置项
  10. 启服和停服
  11. 或
  12. 启动一个 Demo
  13. 写一个简单的 Web 应用框架
  14. 框架核心代码
  15. 业务逻辑代码
  16. 定义应用入口
  17. 注册路由
  18. 运行框架
  19. 输出:hello world
  20. 输出:api response data
  21. 输出:Page not found
  22. 总结

更多推荐文章

查看全部
  • Spring WebFlux 深度实践指南
  • Spring Cloud Gateway 文件上传代理:处理大文件 multipart 请求
  • 为什么许多开发者开始放弃 LangChain?
  • Z-Image-GGUF 本地部署指南:量化技术与 AI 绘画实战
  • Android 密码输入控件的另一种实现:单个 EditText 配上多个 ImageView
  • IDA Pro 远程调试指南:gdbserver 与 armlinux_server 实战
  • 基于 Netty 的轻量斗地主服务器部署及 cpolar 内网穿透方案
  • MCP 服务器安装:npx 与 uvx/uvenv 的实操笔记
  • 无人机视觉任务常用数据集汇总:检测与分割资源整理
  • PyCharm 集成 GitHub Copilot 学生认证与配置指南
  • AI 编程工具定价对比:Cursor、Windsurf、Kiro、Zed 及 VS Code
  • cann-recipes-train 仓库深度解读:昇腾平台下 DeepSeek-R1 与 Qwen2.5 强化学习训练优化实践
  • 鸿蒙电商购物车全栈实战:用户管理、商品列表与购物车功能实现
  • 基于 FPGA 的 IIC 协议驱动 OLED 显示屏及 DHT11 数据读取
  • Vue3 + PlayCanvas 实战:3D 地图自由巡视闯关游戏开发
  • 高性能加法器的 FPGA 综合优化策略
  • 非科班转码者 AI 学习路径指南:从基础到实战
  • 基于 Vue 3 构建 imToken 风格钱包交互原型及核心流程验证
  • Windows 下 OpenClaw 开源 AI 代理框架部署指南
  • 大语言模型词表裁剪的实现思路与代码

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online