当前位置:首页 > CN2资讯 > 正文内容

Python 服务器图片 python 简单服务器

3天前CN2资讯


Python运行环境:Ubuntu Ubuntu 18.04.1 LTS
本文仅用于记录学习和分析Python的过程,Python还有很多搭建web服务器的框架本文都不涉及。

最简单的方式

执行命令:

$ python -m SimpleHTTPServer //如果不指定端口,默认使用8000

然后在浏览器上输入:

http://localhost:8000/ //把localhost改成Linux主机ip

然后Duang~~~

网页上显示出这个,那个A_File是我在Linux下运行Python文件里面的一个文件。

什么,就这么简单?好吧,作为一个Linux C程序员,不得不说,我得研究一下源码。

SimpleHTTPServer

网页哪来的?

最基本的理解是,有网页就得有html文件,而且很显而易见的是,这个网页看上去是调整过格式的。

开始的想法

一开始想到就是在我的Linux环境里是有一个这样的html文件存在的,在使用SimpleHTTPServer模块时会找到它,并且推给前端。然后就在Python安装路径和系统里找这个文件,最后都把以前玩过的Apache和Tomcat里面的html都翻出来了也没对上号。。。

换个思路

先考虑两点:
1. 打开网页时HTTP Server会有这样的信息:“GET / HTTP/1.1” 200 -。说明打开网页的时候执行的是GET请求(这个好像是理所当然的)。
2. 从浏览器上查看网页源码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html> <title>Directory listing for /</title> <body> <h2>Directory listing for /</h2> <hr> <ul> <li><a href="A_File">A_File</a> </ul> <hr> </body> </html>

接下来从源码的角度分析一下:
在我的Linux系统中找到SimpleHTTPServer模块源码(感兴趣的源码自行查找),查看do_GET() 方法:

def do_GET(self): """Serve a GET request.""" f = self.send_head() if f: try: self.copyfile(f, self.wfile) finally: f.close()

这么一看应该是要看一下send_head() 方法做了什么,里面有这样一段代码:

path = self.translate_path(self.path) f = None if os.path.isdir(path): parts = urlparse.urlsplit(self.path) if not parts.path.endswith('/'): # redirect browser - doing basically what apache does self.send_response(301) new_parts = (parts[0], parts[1], parts[2] + '/', parts[3], parts[4]) new_url = urlparse.urlunsplit(new_parts) self.send_header("Location", new_url) self.end_headers() return None for index in "index.html", "index.htm": index = os.path.join(path, index) if os.path.exists(index): path = index break else: return self.list_directory(path)

主要看一下for循环的作用,实际上是在当前路径下查找index.html, index.htm 如果没找到就return到 list_directory() 方法,紧接着就在list_directory() 方法里看到这样的代码:

f.write('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">') f.write("<html>\n<title>Directory listing for %s</title>\n" % displaypath) f.write("<body>\n<h2>Directory listing for %s</h2>\n" % displaypath) f.write("<hr>\n<ul>\n") for name in list: fullname = os.path.join(path, name) displayname = linkname = name # Append / for directories or @ for symbolic links if os.path.isdir(fullname): displayname = name + "/" linkname = name + "/" if os.path.islink(fullname): displayname = name + "@" # Note: a link to a directory displays with @ and links with / f.write('<li><a href="%s">%s</a>\n' % (urllib.quote(linkname), cgi.escape(displayname))) f.write("</ul>\n<hr>\n</body>\n</html>\n")

很显然,这个段代码刚好对应到了上面贴的网页源码。现在真相大白了,在打开网页时do_GET() 方法会调用 list_directory() 创建一个html出来给前端显示。

验证一下

虽然从代码的逻辑上分析完了,但是总觉得怪怪的,还是要自己跑一下代码才放心啊。

使用Python的好处就是可以方便的进行验证,这一点就比C方便的多。
首先把SimpleHTTPServer.py从源码路径里copy出来放到与A_File同一路径下,然后执行命令:

$ python SimpleHTTPServer.py

然后用服务器ip打开网页会看到:


网页可以正常打开,显示的也正是预期的结果,说明刚刚的操作是正确的。

这也正是用Python的优势所在,这个源码文件其实是需要BaseHTTPServer 等模块支持的,但是我并没有把这个模块copy过来。当然也是因为在Linux环境下安装Python的时候就已经配置好环境变量了。当然也可以类比Shell。根据上面的分析,如果再当前路径下有html文件会怎么样呢?

创建一个index.html文件,里面加上一句"Hello World!",然后启动脚本在打开网页会显示如下:


(万年的Hello World???)

这说明之前对那个for 循环部分的代码分析是没错的。同样的可以把list_directory() 方法里面的StringIO 打印出来也会对上面的介绍进行验证。

至于在GET请求时 “GET / HTTP/1.1” 200 - 这个信息打印是怎么打印出来的呢,可以把BaseHTTPServer 模块源码copy过来做一下验证,里面有个log_message() 方法,具体代码逻辑就不在这里分析了。

也就是说,所有的现象只要仔细分析一下源码都能找到根源。

为什么要用Python搭建,因为如果单纯的想要从服务器上下载文件,用Python 的SimpleHTTPServer 模块搭建一个服务器要比搭建ftp或者是tftp简单的多。
但是这个单纯的执行一下 命令python -m SimpleHTTPServer,只能实现文件的下载功能,如果想要实现文件上传功能可以参考:https:///tualatrix/tools/blob/master/SimpleHTTPServerWithUpload.py 这里面实现了POST请求功能。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/20928.html

    分享给朋友:

    “Python 服务器图片 python 简单服务器” 的相关文章

    选择合适的服务器购买攻略:性能、预算与品牌分析

    在购买服务器之前,进行充分的准备至关重要。首先,我喜欢明确自己购买服务器的目的。是否只是用来搭建网站,还是用于复杂的数据处理,抑或是作为云计算的基础设施?这些需求会直接影响我的选择。明确目标后,我可以更好地针对我的具体需求进行规划。 接着,我必须考虑预算。无论是想购买入门级的服务器,还是高性能的旗舰...

    优化RackNerd DC2机房 IP使用体验与性能评测

    我最近对RackNerd的DC2机房产生了越来越多的兴趣,特别是位于美国洛杉矶的这座机房。它被誉为RackNerd中中国国内访问速度较快的机房之一,吸引了很多需求高效网络连接的用户。这座机房的地理位置确实蛮不错,靠近美西主干线,对于需要与国内建立连接的网站和应用来说,能带来相对更快的访问速度。 对于...

    VPS是什么?全面解析虚拟专用服务器的优势与选择

    VPS 是 什么 VPS,全称虚拟专用服务器,是一种通过虚拟化技术在物理服务器上创建多个独立环境的方案。具体来说,每个VPS都能运行自己的操作系统,并拥有独立的CPU、内存和存储资源。这就意味着,用户可以像在独立服务器上那样自由管理自己的VPS,进行各种应用和服务的部署。 最初,当我接触到VPS时,...

    全面解析VPS测评:如何选择最佳虚拟专用服务器

    了解VPS(虚拟专用服务器)对许多人来说并不陌生。在我们的网络环境中,VPS作为一种重要的服务器解决方案,广泛应用于网站托管、应用开发、以及各种在线服务的支持。VPS让用户可以在共享环境中获得类似独立服务器的资源,提供了灵活性和更好的性能。与共享主机相比,VPS的显著优势在于更高的资源保障和自定义能...

    菲律宾用户如何通过VPS提升TikTok访问速度

    在菲律宾使用VPS访问TikTok,这个话题对很多喜欢在TikTok上进行电商活动或内容创作的人来说非常重要。首先,我想谈谈VPS的概念以及它的优势。VPS,全称是虚拟专用服务器,它提供了一种比共享主机更为灵活和高效的解决方案。对于菲律宾的用户来说,通过使用VPS,可以在一定程度上绕过地区限制,更流...

    国内注册ChatGPT的安全与实用指南

    在使用ChatGPT服务时,安全与隐私保护是非常重要的。首先,我总是尽量避免在聊天或任何交流中输入敏感信息。无论是个人身份、财务信息,还是其他隐私内容,我都保持警惕,确保我的信息不会被泄露。即便是在与AI进行对话时,这种谨慎也同样必要,因为即使是最可信的平台也无法完全保障信息不被滥用。 还有一点是选...