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

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

背景

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

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

拉出内网 Web 服务

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

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

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

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

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

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

bash 复制代码
man python3

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

有几个点说下:

  • 首先,Python 会在 sys.path中查找指定的模块名,比如这里是 http.serversys.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 接近 80HTTP 默认端口 ),容易记忆,所以本地开发版网站一般在端口 8000 调试完成后,再升级到端口 80 作为正式网站
  • type=int:会自动把输入转成整数

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

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

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


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

相关推荐
炸膛坦客7 分钟前
Linux - Ubuntu - PC端:(三)切换中英文,Fcitx5
linux·ubuntu
7yewh8 分钟前
jetson_yolo_deployment 01_linux_dev_env
linux·嵌入式硬件·yolo·机器人·嵌入式
cyber_两只龙宝11 分钟前
【Haproxy】Haproxy的算法详解及配置
linux·运维·服务器·云原生·负载均衡·haproxy·调度算法
阿常呓语22 分钟前
Linux命令 jq详解
linux·运维·shell·jq
C澒34 分钟前
微前端容器标准化:公共能力标准化
前端·架构
Setsuna_F_Seiei42 分钟前
AI 对话应用之 JS 的流式接口数据处理
前端·javascript·ai编程
青柠代码录1 小时前
【Vue3】Vue Router 4 路由全解
前端·vue.js
君生我老1 小时前
Linux 权限
linux
无限大61 小时前
《AI观,观AI》:专栏总结+答疑|吃透核心,解决你用AI的所有困惑
前端·后端
hy____1232 小时前
Linux_网络基础3
linux·服务器·网络