python 结束 serve_forever_Python BaseHTTPServer.HTTPServer – 启动和停止事件的回调

It would be excellent to configure the http server with the following

callbacks:

before starting the server

after starting the server

before stopping the server

after stopping the server

请记住,操作系统将在套接字开始侦听时开始接受和排队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块中,因为如果在构造期间按CTRL-C,则服务器变量将不存在.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值