6

私のPythonスクリプトでは、Webサーバーを実行しようとしています。

server = BaseHTTPServer.HTTPServer(('127.0.0.1',8080), RequestHandler)

リクエストハンドラークラスがあります:

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        # Doing Some Stuff.

今、私は常にいくつかのデータがdo_GETでキャッチされるのを待ちます。たとえば60秒後にこのWebサーバーを閉じるタイムアウト操作を実装したいと思います。私はそれを実装することができません。このシナリオでWebサーバーの自動シャットダウン操作を実装する方法を教えてください。

ありがとうタラシン

4

7 に答える 7

8

私があなたの質問を正しく理解していると仮定すると、do_GETこのメソッドが呼び出されるまでにリクエストがすでに読み取られているため、で読み取りタイムアウトを実装することはできません。

BaseHTTPRequestHandlerextendsはextendsStreamRequestHandlerであるためBaseRequestHandler、オーバーライドsetup()して、タイムアウトを使用してソケットを初期化できます。

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def setup(self):
    BaseHTTPServer.BaseHTTPRequestHandler.setup(self)
    self.request.settimeout(60)

  def do_GET(self):
    # ...
于 2010-12-12T00:10:31.417 に答える
6

スーパークラスを呼び出した場合、def setup で self.timeout の値を設定しても機能しないことが実際にわかりました。HTTPServer インスタンスの作成中に、Handler の setup およびinitメソッドが呼び出されないようです。これを確認するためにpydevdを使用しました。

だから、私は一歩後退しました:

httpd = BaseHTTPServer.HTTPServer(server_address, MyHttpHandler)
httpd.timeout = 10

これは完全に機能し、コア コードをオーバーライドしたり、独自の派生クラスを作成したりする必要はありません。そのようにしたい場合は、Handler コードではなく、HTTPServer コードを上書きする必要があるようです。

于 2016-10-05T06:06:01.760 に答える
2

HTTPリクエストに対してタイムアウトを機能させることができました

self.rfile._sock.settimeout(60)

お役に立てれば

于 2011-09-16T16:57:47.280 に答える
1
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
    BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, request, client_address, server)   
    self.timeout = 60
于 2014-02-21T06:53:55.907 に答える