如何从 Python HTTP 服务器调用函数?

no.*_*ing 6 python simplehttpserver basehttprequesthandler

我想为我的一个应用程序提供一个 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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

server = HTTPServer(("localhost", port), _RequestHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

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

我能做些什么?必须有某种方法将自定义数据对象获取到_RequestHandler实例中,对吗?我的意思是,如果没有,那么所有服务器内容似乎都会受到严格限制。但我不知道如何做到这一点,因为我无权访问_RequestHandler. 它将由HTTPServer班级为我创建,不会传递给外部。

有什么建议么?