设置后如何在 Python 中访问 HTTPServer 的 RequestHandlerClass?
How to access RequestHandlerClass for HTTPServer in Python once it is set?
我有一个自定义 BaseHTTPServer.BaseHTTPRequestHandler
可以(部分)在下面看到。它有一个特殊的方法,允许我分配一个回复生成器 - 一个 class 接收一些数据(例如 GET 请求中某些参数的值)并生成一个 XML 回复然后可以作为对请求的回复发送回客户端:
class CustomHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# implementation
# ...
def set_reply_generator(self, generator):
self.generator = generator
def do_GET(self):
# process GET request
# ...
# and generate reply using generator
reply = self.generator.generate(...) # ... are some parameters that were in the GET request
# Encode
reply = reply.encode()
# set headers
self.__set_headers__(data_type='application/xml', data=reply)
# and send away
self.wfile.write(reply)
self.wfile.write('\n'.encode())
我将此处理程序传递给 BaseHTTPServer.HTTPServer
:
def run(addr='127.0.0.1', port=8080):
server_addr = (addr, port)
server = BaseHTTPServer.HTTPServer(server_addr)
server_thread = threading.Thread(target=server.server_forever)
server_thread.start()
由于 BaseHTTPServer.HTTPServer
的构造函数期望 class 而不是实例作为 RequestHandlerClass
参数传递,我不能只创建我的处理程序的实例,调用 set_reply_generator()
然后传递下去。即使这有效,我仍然希望以后能够访问处理程序(例如,如果通过 POST 请求,GET 请求的回复生成器已更改),为此我需要知道如何检索服务器正在使用的实例。
我已经看过 here 但没找到(可能没找到)。我有一种不好的感觉,它是私有的(又名 __...__
)。
到目前为止我能找到的是服务器使用的处理程序的 class 可以通过 RequestHandlerClass
成员检索,但是这与检索一个允许我调用 set_reply_generator(...)
.
的处理程序实例
此外,我尝试实际创建自定义处理程序的实例,但后来我陷入了先有鸡还是先有蛋的问题:
- 处理程序的构造函数需要您传递服务器的实例
- 服务器要求您传递处理程序
这是一种间接证明 HTTPServer
的构造函数是负责实例化处理程序的构造函数。
已回答here。无需直接访问处理程序,而是创建一个静态 class 成员,无需实例即可访问该成员,但在处理程序想要使用它时仍会对其进行处理。
我有一个自定义 BaseHTTPServer.BaseHTTPRequestHandler
可以(部分)在下面看到。它有一个特殊的方法,允许我分配一个回复生成器 - 一个 class 接收一些数据(例如 GET 请求中某些参数的值)并生成一个 XML 回复然后可以作为对请求的回复发送回客户端:
class CustomHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# implementation
# ...
def set_reply_generator(self, generator):
self.generator = generator
def do_GET(self):
# process GET request
# ...
# and generate reply using generator
reply = self.generator.generate(...) # ... are some parameters that were in the GET request
# Encode
reply = reply.encode()
# set headers
self.__set_headers__(data_type='application/xml', data=reply)
# and send away
self.wfile.write(reply)
self.wfile.write('\n'.encode())
我将此处理程序传递给 BaseHTTPServer.HTTPServer
:
def run(addr='127.0.0.1', port=8080):
server_addr = (addr, port)
server = BaseHTTPServer.HTTPServer(server_addr)
server_thread = threading.Thread(target=server.server_forever)
server_thread.start()
由于 BaseHTTPServer.HTTPServer
的构造函数期望 class 而不是实例作为 RequestHandlerClass
参数传递,我不能只创建我的处理程序的实例,调用 set_reply_generator()
然后传递下去。即使这有效,我仍然希望以后能够访问处理程序(例如,如果通过 POST 请求,GET 请求的回复生成器已更改),为此我需要知道如何检索服务器正在使用的实例。
我已经看过 here 但没找到(可能没找到)。我有一种不好的感觉,它是私有的(又名 __...__
)。
到目前为止我能找到的是服务器使用的处理程序的 class 可以通过 RequestHandlerClass
成员检索,但是这与检索一个允许我调用 set_reply_generator(...)
.
此外,我尝试实际创建自定义处理程序的实例,但后来我陷入了先有鸡还是先有蛋的问题:
- 处理程序的构造函数需要您传递服务器的实例
- 服务器要求您传递处理程序
这是一种间接证明 HTTPServer
的构造函数是负责实例化处理程序的构造函数。
已回答here。无需直接访问处理程序,而是创建一个静态 class 成员,无需实例即可访问该成员,但在处理程序想要使用它时仍会对其进行处理。