【问题标题】:How to send an html string from a python http web server?如何从 python http web 服务器发送一个 html 字符串?
【发布时间】:2013-03-27 00:37:13
【问题描述】:

我从http://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python找到了一个python http web服务器

import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler


HandlerClass = SimpleHTTPRequestHandler
ServerClass  = BaseHTTPServer.HTTPServer
Protocol     = "HTTP/1.0"

if sys.argv[1:]:
    port = int(sys.argv[1])
else:
    port = 8000
server_address = ('127.0.0.1', port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()

如果目录有一个名为 index.html 的文件,该文件将作为初始文件。如果没有index.html,那么会列出目录下的文件。

如何修改脚本以便将自定义 html 发送到浏览器?

【问题讨论】:

  • 你到底为什么想要这个? Apache 和 Nginx 的存在是有原因的。 SimpleHTTPServer 是一个完整的玩具实现,它不适合任何东西,真的。
  • @TylerEaves 我想在服务器上以 root 身份执行命令并将其结果显示到浏览器。
  • 寻求像 Flask 这样的最小框架。
  • 不需要服务器,只需将html转储到/tmp中的文件并执行浏览器

标签: python simplehttpserver


【解决方案1】:

正如名称和文档所暗示的那样,SimpleHTTPServer 非常简单,旨在用作示例代码,用于在标准库的框架之上构建您自己的服务器。

所以,如果你想用它做任何事情,你可能想复制和修改the source,或者只是将它作为灵感。

如果你想做任何事情认真,你可能想要使用为编写真正的 HTTP 服务器而设计的框架,如 tornadotwisted,或者只是使用普通的 HTTP 服务器并委托通过 WSGI 将动态页面发送到 Python。

但如果你真的想这样做,你可以。没有什么能阻止你继承SimpleHTTPServer.SimpleHTTPRequestHandler 并覆盖它的方法。例如:

class MyHandler(SimpleHTTPRequestHandler):
    def send_head(self):
        if self.translate_path(self.path).endswith('/foo'):
            body = gaping_security_hole(self.path)
            self.send_response(200)
            self.send_header("Content-type", "text/html; charset=utf-8")
            self.send_header("Content-Length", str(len(body)))
            self.end_headers()
            return StringIO(body)
        else:
            return super(MyHandler, self).send_head()

显然你可以在那里检查你想要的任何东西,而不是endswith('/foo')。例如,从the source 中可以看到,默认实现检查os.path.isdir,如果为真则检查它是否endswith('/'),以及目录是否有任何名为index.htmlindex.htm 的内容,然后再决定要执行什么做。

【讨论】:

  • 我无法初始化 Handler = MyHandler() TypeError: __init__() takes exactly 4 arguments (1 given)
  • 就这样使用HandlerClass = MyHandler然后httpd = ServerClass (server_address, HandlerClass)httpd.serve_forever()
猜你喜欢
  • 2015-10-20
  • 2012-02-27
  • 1970-01-01
  • 2021-11-20
  • 2016-07-25
  • 2012-05-21
  • 2011-08-02
  • 2020-01-14
  • 2023-03-30
相关资源
最近更新 更多