46、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(三)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(二)

分析了 Python 中 http.server 模块的 headpost 方法,下面继续

Python http.server

OK,最后再简单介绍一下 http.server 模块的 cgi 功能

CGI 全称 Common Gateway Interface,中文叫通用网关接口,是一种早期的 Web 动态内容标准协议 ,CGI 定义了 Web 服务器如何与外部程序(脚本)通信,从而生成动态网页,其核心在于,当用户请求网页某个特定路径下的文件时,Web 服务器不返回这个文件本身,而是启动一个进程运行这个脚本,把脚本的输出作为 HTTP 响应返回给浏览器,这样,网页内容就不是固定写死的 HTML,而是程序实时生成的,这就是动态网站的雏形

下面对比下 CGI 和静态网站的关系

  • 静态网站 :内容来源于预先写好的 *.html 文件,不执行代码,比如请求 index.html 就直接返回 index.html 的内容,所有人看到的东西都一样
  • CGI (动态网站) :内容是 Python 脚本实时生成,需要执行代码,用户请求网页中的特殊路径后,Web 服务器执行路径下的 cgi 脚本后输出内容,可根据用户,参数等返回不同的个性化内容

对于动态网站而言,CGI 只是其中的一种实现方式,虽然现在用的比较少,但原理很重要,OK,下面再说下 http.server 模块中的 CGIHTTPRequestHandler 处理类,CGIHTTPRequestHandler 是一个支持 CGI 的增强版处理服务,比默认的 SimpleHTTPRequestHandler 多了一个能力:当请求的路径在 cgi_directories (默认是 /cgi-bin/htbin)时,不返回文件,而是将这个文件作为 CGI 脚本去执行

举个例子,在网站首页(也就是 index.html 文件同级目录下)新建一个文件夹 /cgi-bin,在其中创建一个文件 hello.py,内容如下

python 复制代码
#!/usr/bin/env python3

print("Content-Type: text/html\n")
print("<h1>Hello from CGI!</h1>")
print("<p>The server executed this script.</p>")

然后还是在网站首页(index.html 文件同级目录)新建一个启动脚本 startup.py,内容如下

python 复制代码
#!/usr/bin/env python3

from http.server import HTTPServer, CGIHTTPRequestHandler
server = HTTPServer(('localhost', 2026), CGIHTTPRequestHandler)
server.serve_forever()

然后记得给 startup.pyhello.pychmod 777 加执行权限

然后访问链接 http://localhost:2026/index.html,可以看到返回静态 HTML 页面

如果访问 http://localhost:8000/cgi-bin/hello.py,就会执行 hello.py,返回动态内容

这就是一个最简单的动态网站

OK,虽然 CGI 能实现动态网页,但现在用的还是很少,因为 CGI 也有其缺点:

  • 性能差 :每次请求都要 fork 一个新进程,开销大
  • 资源浪费:无法复用内存,数据库连接等
  • 扩展难:不适合复杂应用

所以现代的 Web 应用开发改用 WSGI(Python 的 Web 标准接口,比如 Flask/Django),或者 Node.js 等更高效的模型,但 CGI 的思想(服务器调用程序生成响应)仍然是动态网站的基础,作为实现动态网站的一种经典机制,CGI 能让 Web 服务器能够运行程序,而不是返回文件,从而使网页内容可以根据时间,用户,数据库等内容动态变化,而 Python 的实现类 CGIHTTPRequestHandler 就是为了在简单场景下支持这种动态行为而设计的

虽然能简单支持动态网站,不过注意,http.server --- HTTP servers 官方也在警告说别在生产环境使用,言外之意,做个应用演示,简单用用得了


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:Nginx 事件驱动分析(一)

相关推荐
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment5 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅5 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊5 小时前
jwt介绍
前端
爱敲代码的小鱼5 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax