4

我想为我的一个应用程序提供一个 Web 界面。为了实现这一点,我BaseHTTPRequestHandlerBaseHTTPServer包中子类化(到我调用的类中_RequestHandler)并为 HTTPHEAD / GET / POST / PUT请求实现我自己的处理程序。

当我收到对“普通文件”的请求时,我只是打开它,从文件系统中读取它并将其提供给浏览器。这很好用。但是,作为 Web 界面,我还想将某些请求传达给应用程序后端。为此,我希望我的服务器提供一个接口,可以在该接口上注册某些 URL 的回调函数(由后端),当有注册 URL 的请求传入并传递请求头和正文时,将调用该接口到为该 URL 注册的请求处理程序(= 回调函数)。

IE。我希望能够做这样的事情。

def callback_function(request):
   # Do some processing.
   return response

srv = WebServer(port = 8080, webroot = "htdocs/")
srv.register("/cgi-bin/test", callback_function)
srv.run()

现在,当有人通过浏览器请求某个尚未注册的任意 URL 时,Web 服务器将加载指定的文件(相对于“Web 根”)并传送它。

我原则上知道如何实现这一点。将应该以不同方式处理的 URL 放在字典中。对于每个请求,检查请求的 URL 是否在字典中。如果是,则将请求数据(HTTP 标头和正文)放入“请求对象”中,调用为该 URL 注册的回调函数并将该请求对象传递给它。从回调函数中获取响应对象,提取其内容(HTTP 标头和正文)并将其提供给客户端。如果 URL 不在“特殊处理”字典中,只需从文件系统(相对于“Web 根”)加载文件并提供它。

问题是,为了运行 Web 服务器,我必须做这样的事情。

server = HTTPServer(("localhost", port), _RequestHandler)
server.serve_forever()

现在的问题是我不能将一个对象,一个实例传递_RequestHandlerHTTPServer. 我必须通过课程本身HTTPServer将为我创建实例,这对我来说是无法访问的,所以我不能在它上面调用方法,因此不能向它注册回调函数(或将回调函数字典传递给构造函数或其他)。

我能做些什么?必须有某种方法可以将自定义数据对象放入_RequestHandler实例中,对吧?我的意思是,如果没有,那么所有服务器的东西似乎都受到了严格的限制。不过,我不知道该怎么做,因为我无权访问_RequestHandler. 它将由HTTPServer班级为我创建,而不是传递给外部。

有什么建议么?

4

0 回答 0