39、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(二)

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

背景

上篇 blog
【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(一)

介绍了如何用 Sphinx 生成网页 HTML,并介绍了如何将网页从内网拉出来进行访问,下面继续

拉出内网 Web 服务

下面再分析下 python3 -m http.server 2025 这个命令,该命令通过使用 Python 内置模块,可以快速启动一个简易 HTTP 服务器,下面来逐项分析

  • python3:调用 Python3 解释器,本质上也是个二进制命令

  • -m:运行一个 Python 模块作为脚本,等会儿详细讲下

  • http.server:Python 标准库中的模块 ,可以提供基本的 HTTP 服务器功能

  • 2025:指定服务器监听的端口号为 2025

OK,再详细讲下 -m 选项,在终端输入

bash 复制代码
man python3

可以找到 -m 选项的描述如下

有几个点说下:

  • 首先,Python 会在 sys.path中查找指定的模块名,比如这里是 http.server,sys.path 是一个包含多个目录路径的列表,这个列表包括当前工作目录,标准库目录(比如 /usr/lib/python3.x/),第三方包安装目录(比如 site-packages),环境变量 PYTHONPATH 中的路径,所以 -m http.server 实际上是在这些地方找 http/server.py,在终端输入
bash 复制代码
find /usr/lib/python3* -name "server.py" -path "*/http/*"

可以看到,其路径如下

  • 找到对应模块后,Python 会像运行普通脚本一样执行这个模块 ,但有一个关键区别:Python 会把该模块所在目录加入 sys.path,此时模块的 name 会被设置为 main ,此时和直接运行 .py 文件的效果一样,这样模块内部就可以写 if __name__ == '__main__': 来定义该模块作为脚本运行时的行为 ,比如 http.server 里就有这样的实现,所以可以直接启动服务器
  • 从 -m module_name 开始,后面的所有命令行参数都不再被 Python 解释器当作选项,而是全部传递给这个模块本身 ,也就是说,-m 将是 Python 解释器的最后一个选项 ,之后的内容都是给模块用的 命令行参数,作为 sys.argv[1:] 传给该模块

OK,-m 选项分析完了,接下来再分析下这里的参数 2025,这里命令上虽然没有说明,但是从 server.py 源码里可以看出来,2025 指的就是端口 port

可以看到

  • port:这个参数没有 - 前缀,表示这是一个位置参数
  • nargs='?':表示这个参数是可选的,可以没有,也可以有
  • default=8000:如果没有这个参数,就默认用 8000(一般是本地开发,测试 Web 服务时的默认端口之一 ),因为 8000 接近 80(HTTP 默认端口 ),容易记忆,所以本地开发版网站一般在端口 8000 调试完成后,再升级到端口 80 作为正式网站
  • type=int:会自动把输入转成整数

这里再解释下位置参数 和选项参数的区别

  • 位置参数 :无前缀,不带 - 或者 --,顺序很重要 ,比如 port 这个参数在解析顺序里是第一个位置参数,那么 server.py 收到的第一个不带选项的参数,就是这个 port 参数,但其实 port 也是最后一个位置参数,相当于是唯一的位置参数
  • 选项参数 :带前缀 -(短选项)或者 --(长选项),对顺序来说不重要,比如上面的 -d,-p

所以这里出现的第一个参数 2025,不带选项,而 server.py 里面有且仅有一个位置参数,那当然就是 port 端口参数了


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【远程开发】拉出内网 Web 服务:后台运行(一)

相关推荐
葡萄城技术团队7 小时前
1000 人协同压测的环境瓶颈排查:CPU 争用与 Wi\-Fi
前端
Ruiery7 小时前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
欧米欧7 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery8 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
excel8 小时前
Marked 与 Markdown 有什么区别?该怎么选?
前端
qetfw8 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
Da Da 泓9 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
zxcvb15310 小时前
远程查看本地文档:一条轻量 Web 文件服务的工程化链路
前端·远程查看文档
niucloud-admin10 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
逆风的蚂蚁10 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器