【问题标题】:A simple website with python using SimpleHTTPServer and SocketServer, how to only display the html file and not the whole directory?一个使用 SimpleHTTPServer 和 SocketServer 的简单网站,如何只显示 html 文件而不显示整个目录?
【发布时间】:2012-05-15 19:37:21
【问题描述】:

访问localhost:8080时如何只显示simplehttpwebsite_content.html?所以我看不到我的文件树,只有网页。顺便说一句,所有这些文件都在同一个目录中。

简单的httpwebsite.py

#!/usr/bin/env python
import SimpleHTTPServer
import SocketServer

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
server = SocketServer.TCPServer(('0.0.0.0', 8080), Handler)

server.serve_forever()

简单的httpwebsite_content.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="simplehttpwebsite_style.css">
  </head>

  <body>
    This is my first web page
  </body>
</html>

简单的httpwebsite_style.css

body{background-color:blue;}

【问题讨论】:

    标签: python networking webpage


    【解决方案1】:

    如果请求/,您可以扩展SimpleHTTPServer.SimpleHTTPRequestHandler 并覆盖do_GET 方法以将self.path 替换为simplehttpwebpage_content.html

    #!/usr/bin/env python
    import SimpleHTTPServer
    import SocketServer
    
    class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
        def do_GET(self):
            if self.path == '/':
                self.path = '/simplehttpwebpage_content.html'
            return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
    
    Handler = MyRequestHandler
    server = SocketServer.TCPServer(('0.0.0.0', 8080), Handler)
    
    server.serve_forever()
    

    由于SimpleHTTPServer.SimpleHTTPRequestHandler 扩展了BaseHTTPServer.BaseHTTPRequestHandler,您可以阅读他们的文档以了解可用的方法和实例变量以及如何操作它们。

    您可以找到BaseHTTPServer.BaseHTTPRequestHandler 的文档中提到的path 变量。你可以找到SimpleHTTPServer.SimpleHTTPRequestHandler的文档中提到的do_GET()方法。

    这是我的 shell 的一些输出,显示了当我运行这个程序然后我尝试访问 http://localhost:8080/ 时会发生什么

    susam@swift:~/so$ ls
    simplehttpwebpage_content.html  simplehttpwebpage.py  simplehttpwebsite_style.css
    susam@swift:~/so$ python simplehttpwebpage.py
    swift - - [19/Apr/2012 09:10:23] "GET / HTTP/1.1" 200 -
    swift - - [19/Apr/2012 09:10:26] "GET /simplehttpwebsite_style.css HTTP/1.1" 200 -
    

    【讨论】:

    • 您的return 不在函数内。即使我将 return 语句放在函数(方法)中,我也会收到 404 错误。
    • 抱歉 Bentley4,这是一个错字。我现在已经修好了。您在运行python simplehttpwebpage.py 的控制台中看到任何错误吗?请注意,simplehttpwebpage_content.html 需要位于运行此脚本的同一目录中。
    • 我写的是 simplewebsite_content.html 而不是 simplewebpage_content.html。 :) 。现在可以使用了。
    【解决方案2】:

    您应该调用您的文件index.html,这是自动提供的页面,而不是列出目录。

    另一种可能性是覆盖处理程序list_directory(self, path) 方法。

    【讨论】:

    • 我不明白为什么有人对你的答案投了反对票。你的回答很有用。
    【解决方案3】:

    基于 Susam Pal 的回答,这是我的实现,它允许设置端口(就像您运行 python -m SimpleHTTPServer 8080 时一样),并且当文件存在于文件服务器上时还提供 html 页面,没有 .html 扩展名.

    #!/usr/bin/env python
    import SimpleHTTPServer
    import SocketServer
    import os.path
    import sys
    
    class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
        def do_GET(self):            
            possible_name = self.path.strip("/")+'.html'
            if self.path == '/':
                # default routing, instead of "index.html"
                self.path = '/simplehttpwebpage_content.html'
            elif os.path.isfile(possible_name):
                # extensionless page serving
                self.path = possible_name
    
            return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
    
    Handler = MyRequestHandler
    
    port = 8000
    if len(sys.argv) > 1:
        try:
            p = int(sys.argv[1])
            port = p
        except ValueError:
            print "port value provided must be an integer"
    
    print "serving on port {0}".format(port)
    server = SocketServer.TCPServer(('0.0.0.0', port), Handler)
    server.serve_forever()
    

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 2018-06-10
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多