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

相关推荐
用户3076752811272 分钟前
💡 从"傻等"到"流淌":我在AI项目中实现流式输出的血泪史(附真实代码+深度解析)
前端
bluceli3 分钟前
前端性能优化实战指南:让你的网页飞起来
前端·性能优化
SuperEugene5 分钟前
Vue状态管理扫盲篇:如何设计一个合理的全局状态树 | 用户、权限、字典、布局配置
前端·vue.js·面试
没想好d6 分钟前
通用管理后台组件库-9-高级表格组件
前端
阿虎儿9 分钟前
React Hook 入门指南
前端·react.js
核以解忧32 分钟前
借助VTable Skill实现10W+数据渲染
前端
WangHappy34 分钟前
不写 Canvas 也能搞定!小程序图片导出的 WebView 通信方案
前端·微信小程序
李剑一39 分钟前
要闹哪样?又出现了一款新的格式化插件,尤雨溪力荐,速度提升了惊人的45倍!
前端·vue.js
闲云一鹤1 小时前
Git LFS 扫盲教程 - 你不会还在用 Git 管理大文件吧?
前端·git·前端工程化
阿虎儿1 小时前
React Context 详解:从入门到性能优化
前端·vue.js·react.js