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 服务:后台运行(一)

相关推荐
百***06012 小时前
SpringMVC 请求参数接收
前端·javascript·算法
天外天-亮2 小时前
Vue + excel下载 + 水印
前端·vue.js·excel
起个名字逛街玩2 小时前
前端正在走向“工程系统化”:从页面开发到复杂产品架构的深度进化
前端·架构
用户47949283569152 小时前
React 渲染两次:是 Bug 还是 Feature?聊聊严格模式的“良苦用心”
前端·react.js·前端框架
b***74883 小时前
前端GraphQL案例
前端·后端·graphql
云飞云共享云桌面3 小时前
无需配置传统电脑——智能装备工厂10个SolidWorks共享一台工作站
运维·服务器·前端·网络·算法·电脑
福尔摩斯张3 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
ganshenml3 小时前
sed 流编辑器在前端部署中的作用
前端·编辑器
TH_13 小时前
腾讯云-(3)-Linux宝塔面板使用
linux·云计算·腾讯云