gpt4 book ai didi

python-3.x - 向 http.server.BaseHTTPRequestHandler 的子类添加一个新的实例变量

转载 作者:行者123 更新时间:2023-12-04 12:01:28 26 4
gpt4 key购买 nike

我希望能够向我的子类 http.server.BaseHTTPRequestHandler 添加一个实例变量.

这是我的代码:

from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib


class Server(BaseHTTPRequestHandler):

def __init__(self, request, client_addr, server):
super().__init__(request, client_addr, server)
self.pathobj = urllib.parse.urlparse(self.path)

def do_HEAD(self):
self.send_response(200)

def do_GET(self):
print(self.pathobj)
self.send_response(200)
self.end_headers()

def do_POST(self):
print(self.pathobj)
self.send_response(405)
self.end_headers()

def run(server_class=HTTPServer, handler_class=Server, port=8080):
server_address = ("", port)
httpd = server_class(server_address, handler_class)

print("Starting httpd on port {}...".format(port))

httpd.serve_forever()

if __name__ == "__main__":
run()

我希望能够访问 ParseResult urllib.parse.urlparse 返回的对象在每个类方法中无需重写 self.pathobj = urllib.parse.urlparse(self.path)在每个类方法的开头。

上面的代码不起作用——当 do_GETdo_POST被称为提示 'Server' object has no attribute 'pathobj' .

以上 docs for http.server.BaseHTTPRequestHandler说:

All of the relevant information is stored in instance variables of the handler. Subclasses should not need to override or extend the __init__() method.



但我没有看到另一种方法来做到这一点。是否可以?

最佳答案

文档说

The handler will parse the request and the headers, then call a method specific to the request type.


事实证明, http.server.BaseHTTPRequestHandler最终继承自 socketserver.BaseRequestHandler , 和 socketserver.BaseRequestHandler.__init__() (定义 here)调用 do_GET() .所以问题是实例变量实际上是在 do_GET() 之后设置的已经被调用了。
因此,为了使这项工作正常进行,您需要移动 self.pathobj线上方 super()行然后重写它来做解析 BaseHTTPRequestHandler做构造 self.path .

关于python-3.x - 向 http.server.BaseHTTPRequestHandler 的子类添加一个新的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43855121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com