我想为我的一个应用程序提供Web界面。为实现这一目标,我将BaseHTTPRequestHandler
包中的BaseHTTPServer
子类化为(我称之为_RequestHandler
的类),并为HTTP HEAD / GET / POST / PUT
请求实现自己的处理程序。
当我收到“普通文件”的请求时,我只需打开它,从文件系统中读取它并将其提供给浏览器。这很好。但是,作为Web界面,我还想将某些请求传达给应用程序后端。为此,我希望我的服务器提供一个接口,通过该接口可以注册某些URL的回调函数(通过后端),当有一个请求传入注册的URL并传递请求头和正文时,将调用该接口。到为该URL注册的请求处理程序(=回调函数)。
予。即我希望能够做到这样的事情。
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()
现在问题是我无法将_RequestHandler
的对象,实例传递给HTTPServer
的构造函数。我必须通过课程本身。 HTTPServer
将为我创建实例,这对我来说是无法访问的,因此我无法在其上调用方法,因此不会向其注册回调函数(或将回调函数的字典传递给构造函数或其他)。
我该怎么办?必须有一些方法可以将自定义数据对象放入_RequestHandler
实例,对吗?我的意思是,如果没有,那么所有服务器的东西似乎严重限制。我不知道如何做到这一点,因为我无法访问_RequestHandler
的实例。它将由HTTPServer
类为我创建,而不是传递给外部。
有什么建议吗?