参考:http://docs.python.org/2/library/basehttpserver.html http://docs.python.org/2/library/basehttpserver.html
我有以下使用的代码片段Python BaseHTTPServer
运行基本的 HTTP 服务器。
from BaseHTTPServer import HTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler
# http request handler
class HttpHandler(BaseHTTPRequestHandler):
def do_POST(self):
print "I have just received a HTTP request through POST"
try:
server = HTTPServer((<ip>, <port>), HttpHandler)
# wait forever for incoming http requests!
server.serve_forever()
except KeyboardInterrupt:
server.socket.close()
我正在寻找一种在 http 服务器启动/停止时获取回调的方法server.serve_forever()
/server.socket.close()
方法。
假设我们有以下函数:
def http_server_start_callback():
print "http server has just been started"
def http_server_stop_callback():
print "http server has just been stopped"
I want http_server_start_callback
在我启动服务器后(每当)立即调用的函数,即server.serve_forever()
而且我要http_server_stop_callback
在我停止服务器后(每当)立即调用函数,即server.socket.close()
最好使用以下回调配置 http 服务器:
- 在启动服务器之前
- 启动服务器后
- 在停止服务器之前
- 停止服务器后
有没有办法设置这些回调Python BaseHTTPServer.HTTPServer
?!
使用以下内容配置 http 服务器会非常好
回调:
- 在启动服务器之前
- 启动服务器后
- 在停止服务器之前
- 停止服务器后
请记住,当套接字开始侦听时,操作系统将开始接受 TCP 连接并对其进行排队,这是在构造函数中完成的BaseHTTPServer
,因此,如果您想在启动服务器之前执行冗长的任务,最好在操作系统开始接受连接之前执行这些任务。
有一个server_activate()
调用的方法socket.listen()
,所以最好重写它。
同样,操作系统将继续接受连接,直到调用socket.close()
,因此,如果您希望能够定义一个能够防止自身关闭的“预停止”处理程序,那么最好使用server_close()
方法,而不是调用socket.close()
直接地。
我整理了一个简单的示例,在请求处理程序上使用类方法来处理四个新事件,尽管您可以将它们移到其他地方......
from BaseHTTPServer import HTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler
# Subclass HTTPServer with some additional callbacks
class CallbackHTTPServer(HTTPServer):
def server_activate(self):
self.RequestHandlerClass.pre_start()
HTTPServer.server_activate(self)
self.RequestHandlerClass.post_start()
def server_close(self):
self.RequestHandlerClass.pre_stop()
HTTPServer.server_close(self)
self.RequestHandlerClass.post_stop()
# HTTP request handler
class HttpHandler(BaseHTTPRequestHandler):
@classmethod
def pre_start(cls):
print 'Before calling socket.listen()'
@classmethod
def post_start(cls):
print 'After calling socket.listen()'
@classmethod
def pre_stop(cls):
print 'Before calling socket.close()'
@classmethod
def post_stop(cls):
print 'After calling socket.close()'
def do_POST(self):
print "I have just received an HTTP POST request"
def main():
# Create server
try:
print "Creating server"
server = CallbackHTTPServer(('', 8000), HttpHandler)
except KeyboardInterrupt:
print "Server creation aborted"
return
# Start serving
try:
print "Calling serve_forever()"
server.serve_forever()
except KeyboardInterrupt:
print "Calling server.server_close()"
server.server_close()
if __name__ == '__main__':
main()
请注意,我还将对构造函数的调用移至其自己的调用中try...except
块,因为server
如果在构造过程中按 CTRL-C,变量将不存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)