[英]python httpserver on separate thread
我試圖在一個單獨的線程上創建一個httpserver,該服務器應該處理單個get請求,如果在URL中傳遞了單個參數,則將其關閉。
import sys
import threading
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
class WebServer(SimpleHTTPRequestHandler,threading.Thread):
port = 9000
protocol_version = "HTTP/1.1"
code = ""
httpd = None
isRunning = False
def do_GET(self):
self.send_response(200)
self.send_header("Content-type","text/html")
self.end_headers()
self.wfile.write("webpage")
try:
self.code = split(self.path,"=")[1]
except:
pass
else:
self.isRunning=False
self.stop()
def do_POST(self):
pass
def __init__(self,port=9000):
threading.Thread.__init__(self)
self.port=port
def run(self):
while True:
server_address = ("127.0.0.1",self.port)
try:
self.httpd = BaseHTTPServer.HTTPServer(server_address,WebServer)
except:
self.port +=1
else:
break
self.isRunning=True
self.httpd.serve_forever()
server = WebServer(1)
server.start()
while(server.isRunning==False):
pass
print "Server running on port: %d" %(server.port)
server.join()
print "code: "+server.code
但是向它發送請求時會發生錯誤:
Server running on port: 1025
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 56462)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 321, in process_request
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
TypeError: __init__() takes at most 2 arguments (4 given)
----------------------------------------
使用curl連接到服務器時,會出現以下錯誤:
curl: (52) Empty reply from server
您想在一堂課上做太多事情。
SimpleHTTPRequestHandler的工作方式是BaseHTTPServer創建一個新實例來處理每個請求。 它通過調用構造函數來實現。 但是您添加了一個新的構造函數,該構造函數用於創建服務器本身。
明白了嗎?
當BaseHttpServer收到請求時,它將采用WebServer類(作為您創建self.httpd的SimpleHTTPRequestHandler的子類傳入),並嘗試創建實例。 它期望SimpleHTTPRequestHandler子類的構造函數具有四個參數,但是您添加了一個僅包含兩個的新構造函數(用於創建Web服務器,而不是處理程序)。
這很奇怪,因為您可能不習慣創建新實例的事情。 但這就是它的工作原理。
因此將您的服務器和請求處理程序分成兩個單獨的類(如kichik所說)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.