Python CGI 同时 AJAX 请求
Python CGI simultaneous AJAX requests
事情是这样的:我正在编写一个简单的轻量级 IRC 应用程序,在本地托管,它基本上与 Xchat 执行相同的工作,并且在您的浏览器中工作,就像 Sabnzbd 一样。我在浏览器中将搜索结果显示为 html table,并使用带有 on_click 事件的 AJAX GET 请求启动下载。我在 1 秒循环中使用另一个 AJAX GET 请求来请求下载信息(状态、进度、速度、ETA 等)。我遇到了并发的 AJAX 请求,因为我的 CGI 处理程序似乎一次只能处理一个线程:实际上,主线程处理下载,同时也发送下载状态请求。
因为我在某个地方有一个 Django 应用程序,所以我尝试实现这个 IRC 应用程序并且一切正常。同时请求得到妥善处理。
那么对于 HTTP 处理程序有什么我必须知道的吗?使用基本的 CGI 句柄处理同时请求是不可能的吗?
我将以下内容用于我的 CGI IRC 应用程序:
from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler
如果不是关于理论而是关于我的代码,如果有帮助,我很乐意 post 各种 python 脚本。
These four classes process requests synchronously; each request must be completed before the next request can be started.
TL;DR: 使用真实的网络服务器。
所以,经过进一步研究,这是我的代码,它有效:
from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler
from socketserver import ThreadingMixIn
import threading
import cgitb; cgitb.enable() ## This line enables CGI error reporting
import webbrowser
class HTTPRequestHandler(CGIHTTPRequestHandler):
"""Handle requests in a separate thread."""
def do_GET(self):
if "shutdown" in self.path:
self.send_head()
print ("shutdown")
server.stop()
else:
self.send_head()
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
allow_reuse_address = True
daemon_threads = True
def shutdown(self):
self.socket.close()
HTTPServer.shutdown(self)
class SimpleHttpServer():
def __init__(self, ip, port):
self.server = ThreadedHTTPServer((ip,port), HTTPRequestHandler)
self.status = 1
def start(self):
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
self.server_thread.start()
def waitForThread(self):
self.server_thread.join()
def stop(self):
self.server.shutdown()
self.waitForThread()
if __name__=='__main__':
HTTPRequestHandler.cgi_directories = ["/", "/ircapp"]
server = SimpleHttpServer('localhost', 8020)
print ('HTTP Server Running...........')
webbrowser.open_new_tab('http://localhost:8020/ircapp/search.py')
server.start()
server.waitForThread()
事情是这样的:我正在编写一个简单的轻量级 IRC 应用程序,在本地托管,它基本上与 Xchat 执行相同的工作,并且在您的浏览器中工作,就像 Sabnzbd 一样。我在浏览器中将搜索结果显示为 html table,并使用带有 on_click 事件的 AJAX GET 请求启动下载。我在 1 秒循环中使用另一个 AJAX GET 请求来请求下载信息(状态、进度、速度、ETA 等)。我遇到了并发的 AJAX 请求,因为我的 CGI 处理程序似乎一次只能处理一个线程:实际上,主线程处理下载,同时也发送下载状态请求。 因为我在某个地方有一个 Django 应用程序,所以我尝试实现这个 IRC 应用程序并且一切正常。同时请求得到妥善处理。 那么对于 HTTP 处理程序有什么我必须知道的吗?使用基本的 CGI 句柄处理同时请求是不可能的吗? 我将以下内容用于我的 CGI IRC 应用程序:
from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler
如果不是关于理论而是关于我的代码,如果有帮助,我很乐意 post 各种 python 脚本。
These four classes process requests synchronously; each request must be completed before the next request can be started.
TL;DR: 使用真实的网络服务器。
所以,经过进一步研究,这是我的代码,它有效:
from http.server import BaseHTTPRequestHandler, HTTPServer, CGIHTTPRequestHandler
from socketserver import ThreadingMixIn
import threading
import cgitb; cgitb.enable() ## This line enables CGI error reporting
import webbrowser
class HTTPRequestHandler(CGIHTTPRequestHandler):
"""Handle requests in a separate thread."""
def do_GET(self):
if "shutdown" in self.path:
self.send_head()
print ("shutdown")
server.stop()
else:
self.send_head()
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
allow_reuse_address = True
daemon_threads = True
def shutdown(self):
self.socket.close()
HTTPServer.shutdown(self)
class SimpleHttpServer():
def __init__(self, ip, port):
self.server = ThreadedHTTPServer((ip,port), HTTPRequestHandler)
self.status = 1
def start(self):
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
self.server_thread.start()
def waitForThread(self):
self.server_thread.join()
def stop(self):
self.server.shutdown()
self.waitForThread()
if __name__=='__main__':
HTTPRequestHandler.cgi_directories = ["/", "/ircapp"]
server = SimpleHttpServer('localhost', 8020)
print ('HTTP Server Running...........')
webbrowser.open_new_tab('http://localhost:8020/ircapp/search.py')
server.start()
server.waitForThread()