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 事件驱动分析(一)

相关推荐
Awu122741 分钟前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude
咪库咪库咪1 小时前
Vue3-生命周期
前端
莪_幻尘2 小时前
你的 AI Skill 越多越蠢?Token 上下文爆炸的求生指南
前端·ai编程
lichenyang4532 小时前
从 has.echo 到异步 API 注册表:一次 ASCF API 回调不触发的排查复盘
前端
林瞅瞅2 小时前
Nuxt3 项目部署 Nginx 防盗链后特定 JS 文件 403 问题修复方案
前端
kyriewen2 小时前
别再每次都 Google 了:我整理了前端日常最常踩的 10 个 Git 坑,附速查表
前端·javascript·git
一颗奇趣蛋3 小时前
Web 视频开发完全指南:从入门到精通
前端
非洲农业不发达3 小时前
windows终端体验大升级,让你拥有macos级别的美化
前端·后端
妙码生花3 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十七):登录接口完善,登录页接口整合,解决跨域
前端·后端·ai编程
唐诗3 小时前
改 3 行配置,我的 Tauri dev 冷启动从 100 秒干到 4 秒
前端·客户端