【问题标题】:Writing response body with BaseHTTPRequestHandler使用 BaseHTTPRequestHandler 编写响应正文
【发布时间】:2011-10-04 10:43:04
【问题描述】:

我正在使用 Python 3.2.2 并想编写一个简单的 Web 服务器来远程访问一些数据。这些数据将由 Python 生成,因此我不想使用 SimpleHTTPRequestHandler,因为它是文件服务器,而是我自己的处理程序。

我从互联网上复制了一些示例,但我被卡住了,因为响应输出流拒绝写入正文内容

这是我的代码:

import http.server
import socketserver

PORT = 8000

class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        print(self.wfile)
        self.wfile.write("<html><head><title>Title goes here.</title></head>")
        self.wfile.write("<body><p>This is a test.</p>")
        # If someone went to "http://something.somewhere.net/foo/bar/",
        # then s.path equals "/foo/bar/".
        self.wfile.write("<p>You accessed path: %s</p>" % self.path)
        self.wfile.write("</body></html>")
        self.wfile.close()

try:
    server = http.server.HTTPServer(('localhost', PORT), MyHandler)
    print('Started http server')
    server.serve_forever()
except KeyboardInterrupt:
    print('^C received, shutting down server')
    server.socket.close()

编写响应正文的正确代码应该是什么?

非常感谢。

编辑:

错误是:

...
  File "server.py", line 16, in do_GET
    self.wfile.write("<html><head><title>Title goes here.</title></head>")
  File "C:\Python32\lib\socket.py", line 297, in write
    return self._sock.send(b)
TypeError: 'str' does not support the buffer interface

【问题讨论】:

  • 我承认我没有 Python 的基础知识 :) 所以我在试图弄清楚如何使用类型和转换它们的工具时有点迷失......
  • 这行代码在哪里? self.wfile.write(prueba)
  • 糟糕,对不起。这是另一个测试的痕迹(prueba = test)。我会解决的。

标签: python basehttprequesthandler


【解决方案1】:

在 Python3 中,字符串与 Python 2.x 中的类型不同。使用

将其转换为字节
self.wfile.write(bytes("<html><head><title>Title goes here.</title></head>/html>","utf-8")) 

self.wfile.write("<html><head><title>Title goes here.</title></head></html>".encode("utf-8"))

【讨论】:

  • 太棒了。现在我想如果有办法将输出流包装在“printwriter”中(是的,我是一名 Java 程序员),呵呵。我们找点东西(或者干脆定义一个简单的转换函数)
  • 我尝试使用 Python 3 的 .encode() 字符串转换,但仍然存在错误。您必须删除最后一行:self.wfile.close(),因为 do_GET 将自行关闭并刷新流。
【解决方案2】:

对于 Python 3,在字符串文字前加上 b:

self.wfile.write(b"<foo>bar</foo>")

【讨论】:

  • 这是这里最干净的解决方案,很好!你能确认这默认为 enoding utf-8 吗?
【解决方案3】:

根据您的代码#cmets,您可能正在寻找 self.headers.getheaders('referer'),即:

if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'):
    do something

【讨论】:

  • 嗯,不是真的。我只想以编程方式控制响应的输出。批准的答案是我需要的。将字符串编码为字节,以便将字节发送到响应。还是谢谢!
【解决方案4】:

只在使用 Python 3.X 时使用它

self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多