Python 编写简易 Web 应用框架实战指南
写应用框架需要写底层服务器吗?
开发 Web 应用框架时,是否需要自己实现底层服务器取决于是否遵循标准。如果应用框架不参考 WSGI (Web Server Gateway Interface) 标准,那么确实需要定义一套属于自己的服务器协议。但这种方式通常不必要,专业的事情应该交给专业的工具来做。
基于 WSGI 标准使用 Python 编写简易 Web 应用框架的方法。文章首先对比了不同 WSGI 服务器如 uWSGI 和 Waitress,详细讲解了 uWSGI 的安装、配置及常用参数。随后通过编写符合 WSGI 规范的 Demo 应用,演示了如何构建基础路由框架,实现了请求路径匹配、函数调用及 404 错误处理。最后整合框架与业务逻辑,展示了完整的启动流程与测试方法,帮助开发者理解 Web 框架底层原理。

开发 Web 应用框架时,是否需要自己实现底层服务器取决于是否遵循标准。如果应用框架不参考 WSGI (Web Server Gateway Interface) 标准,那么确实需要定义一套属于自己的服务器协议。但这种方式通常不必要,专业的事情应该交给专业的工具来做。
我们将编写符合 WSGI 标准的框架,因此只需要引入符合该标准的服务器即可。
WSGI 外,还支持 HTTP、WebSocket 等协议。它提供了多进程、多线程、协程、异步 IO 等多种运行模式,并支持内存共享、定时任务、快速热部署等高级功能。WSGI 服务器,适合运行 Python Web 应用。本文将以 uWSGI 为例进行讲解。
在 Python 环境中,直接使用 pip 安装即可:
pip3 install 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 读取配置文件。
指定启动用户和用户组
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>
首先编写一个符合 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/
基于 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
代码解析:
webRoute 存储路由映射关系,Key 为 URL 路径,Value 为处理函数。application 函数是 WSGI 入口,获取请求路径并在字典中匹配。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 系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online