【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(二)
分析了 Python 中 http.server 模块的 head,post 方法,下面继续
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.py 和 hello.py 用 chmod 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 事件驱动分析(一)