【问题标题】:Read HTTP request data in Python 3?在 Python 3 中读取 HTTP 请求数据?
【发布时间】:2019-02-09 15:10:20
【问题描述】:

我正在尝试编写一个基本的“回显”HTTP 服务器,它可以写回它在请求中接收到的原始数据。如何获取字符串形式的请求数据?

这是我的程序:

#!/usr/bin/env python
from http.server import HTTPServer, BaseHTTPRequestHandler


class RequestHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    print('data', self.rfile.readall())
    self.send_response(200)
    self.send_header('Content-Type', 'text/html')
    self.end_headers()
    message = 'Hello Client!'
    self.wfile.write(bytes(message, 'utf8'))
    return

def server_start():
  address = ('', 1992)
  httpd = HTTPServer(address, RequestHandler)
  httpd.serve_forever()


server_start()

错误:

self.rfile.readall(): '_io.BufferedReader' object has no attribute 'readall'

【问题讨论】:

    标签: python python-3.x http server httpserver


    【解决方案1】:

    如果是获取请求,则不会有body,因此数据将在url 中发送。

    from http.server import HTTPServer, BaseHTTPRequestHandler
    import urlparse
    
    class RequestHandler(BaseHTTPRequestHandler):
        def do_GET(self):
            parsed_path = urlparse.urlparse(self.path)
            print(parsed_path.query)
            ...
    

    否则,如果您想将任何更复杂的对象作为数据发送,您应该实现 POST 方法(如果您不熟悉它们,请查看不同的 HTTP methods)。

    post 方法类似于:

    def do_POST(self):
        post_body = self.rfile.readall()
    

    请注意,在这里您可以使用方法rfile.readall()。在这里你有一个很好的gist 有一些例子!

    【讨论】:

    • 要点很好用!我试图在do_GET() 中读取已知长度的字节,例如self.rfile.read(5),但它只是卡住了。看来do_GET() 不支持任何读取。我在do_POST() 中尝试了self.rfile.readall(),但它不起作用,与上述相同的错误。感谢Content-Length 方法。
    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多