首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在设置RequestHandlerClass后访问HTTPServer中的HTTPServer?

如何在设置RequestHandlerClass后访问HTTPServer中的HTTPServer?
EN

Stack Overflow用户
提问于 2018-02-15 13:06:44
回答 1查看 2.6K关注 0票数 2

我有一个定制的BaseHTTPServer.BaseHTTPRequestHandler,可以(部分)在下面看到。它有一个特殊的方法,允许我分配一个应答生成器--一个类接受一些数据(例如,GET请求中的一些参数的值),并生成一个XML回复,然后作为对请求的答复发送回客户机:

代码语言:javascript
复制
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

代码语言:javascript
复制
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的构造函数期望类而不是实例作为RequestHandlerClass参数传递,所以我不能只创建处理程序的实例,调用set_reply_generator(),然后传递它。即使这样做有效,我还是希望以后能够访问处理程序(例如,如果通过POST请求更改了GET请求的应答生成器),为此,我需要知道如何检索服务器正在使用的实例。

我看过这里,但找不到它(可能错过了)。我有一种不好的预感,它是私人的(又名__...__)。

到目前为止,我所能发现的是,服务器使用的处理程序的类可以通过RequestHandlerClass成员检索,但是这与检索将允许我调用set_reply_generator(...)的处理程序实例不一样。

此外,我试图实际创建自定义处理程序的一个实例,但随后我遇到了一个鸡与蛋问题:

  • 处理程序的构造函数要求您传递服务器的实例。
  • 服务器要求您传递处理程序。

这是一个间接的证明,证明HTTPServer的构造函数是负责实例化处理程序的构造函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-15 14:06:08

已经回答了这里。不需要直接访问处理程序,而是创建一个静态类成员,它可以在没有实例的情况下进行访问,但在处理程序想要使用它时仍然需要处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48808048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档