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

相关推荐
测试-鹏哥40 分钟前
ITP平台全新Mock服务上线 —— 助力高效API测试
前端·python·测试工具
BlackWolfSky41 分钟前
ES6 教程学习笔记
前端·javascript·es6
IT_陈寒41 分钟前
Redis性能翻倍的5个冷门技巧:从缓存穿透到集群优化实战指南
前端·人工智能·后端
不会写DN44 分钟前
如何实现UniApp登录拦截?
前端·javascript·vue.js·typescript·uni-app·vue
哆啦A梦158844 分钟前
67 token 过期时间
前端·javascript·vue.js·node.js
萌狼蓝天1 小时前
[Vue]AntV1.7表格自带筛选确定和重置按钮位置交换
前端·javascript·css·vue.js·html
by__csdn1 小时前
Axios封装实战:Vue2高效HTTP请求
前端·javascript·vue.js·ajax·vue·css3·html5
匠心网络科技1 小时前
前端框架-框架为何应运而生?
前端·javascript·vue.js·学习