3

参照: 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()

私が探しているのは、server.serve_forever()/server.socket.close()メソッドを使用して http サーバーが開始/停止されるたびにコールバックを取得する方法です。

次の関数があるとします。

def http_server_start_callback():
    print "http server has just been started" 

def http_server_stop_callback():
    print "http server has just been stopped" 

http_server_start_callbackサーバーを起動した直後(いつでも)に関数を呼び出したい、つまりサーバーを停止した直後(いつでも)に関数を呼び出しserver.serve_forever()たいhttp_server_stop_callbackserver.socket.close()

次のコールバックを使用して http サーバーを構成することをお勧めします。

  • サーバーを起動する前に
  • サーバー起動後
  • サーバーを停止する前に
  • サーバーを停止した後

これらのコールバックを設定する方法はありますPython BaseHTTPServer.HTTPServerか?!

4

2 に答える 2

4

次のコールバックを使用して http サーバーを構成することをお勧めします。

  • サーバーを起動する前に
  • サーバー起動後
  • サーバーを停止する前に
  • サーバーを停止した後

ソケットがリッスンを開始した瞬間に、OS が TCP 接続の受け入れとキューイングを開始することに注意してください。これは のコンストラクターで行われBaseHTTPServerます。したがって、サーバーを起動する前に長いタスクを実行する場合は、OS の前にそれらを実行することをお勧めします。接続の受け入れを開始します。

server_activate()を呼び出すメソッドがあるのでsocket.listen()、それをオーバーライドするのがおそらく最善です。

同様に、OS は への呼び出しまで接続を受け入れ続けsocket.close()ます。そのため、それ自体がシャットダウンされるのを防ぐ機能を持つ「事前停止」ハンドラーを定義できるようにしたい場合は、おそらくserver_close()メソッドを使用することをお勧めします。socket.close()直接電話するよりも

リクエスト ハンドラーでクラス メソッドを使用して 4 つの新しいイベントを処理する簡単な例をまとめましたが、別の場所に移動することもできます...

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()

構築中に CTRL-C を押すと変数が存在しないため、コンストラクターへの呼び出しも独自のtry...exceptブロックに移動したことに注意してください。server

于 2013-05-30T13:47:19.230 に答える
3

HTTPServer代わりにクラスをサブクラス化して使用する必要がありますHTTPServer

from __future__ import print_function
from BaseHTTPServer import HTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler


class MyHTTPServer(HTTPServer):


    def __init__(self, *args, **kwargs):

        self.on_before_serve = kwargs.pop('on_before_serve', None)
        HTTPServer.__init__(self, *args, **kwargs)

    def serve_forever(self, poll_interval=0.5):

        if self.on_before_serve:
            self.on_before_serve(self)
        HTTPServer.serve_forever(self, poll_interval)


# http request handler
class HttpHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        print("I have just received a HTTP request through POST")

try:
    server = MyHTTPServer(('0.0.0.0', 8080), HttpHandler,
                          on_before_serve = lambda server: print('Server will start to serve in the moment...'))

    # wait forever for incoming http requests!
    server.serve_forever()

except KeyboardInterrupt:
    server.socket.close()
于 2013-05-24T15:10:57.010 に答える