如何创建一个可以在启动时初始化变量并在请求处理程序中使用这些变量的 python 服务器?

问题描述 投票:0回答:1

我正在尝试创建一个Python服务器,在处理请求时需要使用一些本地数据。这是我的代码:

httpd = HTTPServer((HOST_NAME,PORT),myHandler)
print(time.asctime(), "Start Server - %s:%s\n"%(HOST_NAME,PORT))
try:
    httpd.serve_forever()
except KeyboardInterrupt:
    pass
httpd.server_close()
print(time.asctime(),'Stop Server - %s:%s' %(HOST_NAME,PORT))

我尝试在 myHandler 类中加载本地数据,但似乎每次发出新请求时,服务器都会重新初始化 myHandler 的新实例,从而重新加载数据。 (这会显着降低服务器速度)。

myHandler 类目前是用单独的 python 脚本编写的,因此我无法在 main 函数上创建全局变量。

如果我合并 main scriptmyHandler script 这样我就可以使用全局变量,它会起作用吗?有没有更好的办法?谢谢您的解决方案。

python http httphandler
1个回答
0
投票

我尝试在 myHandler 类中加载本地数据,但似乎每次发出新请求时,服务器都会重新初始化 myHandler 的新实例...

是的。处理程序与请求相关联。如果您的数据应在服务器的生命周期内持续存在,则需要将其作为 server 类的一部分。例如,我们可以像这样子类化

HTTPServer

import time
from http.server import HTTPServer, BaseHTTPRequestHandler

HOST_NAME = 'localhost'
PORT = 8080

class MyServer(HTTPServer):
    def __init__(self, address, handler):
        self.myData = 0
        super().__init__(address, handler)


class myHandler(BaseHTTPRequestHandler):
    def do_GET(self, *args):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(f"This is a test: {self.server.myData}\n".encode())
        self.server.myData += 1

httpd = MyServer((HOST_NAME,PORT),myHandler)
print(time.asctime(), "Start Server - %s:%s\n"%(HOST_NAME,PORT))
try:
    httpd.serve_forever()
except KeyboardInterrupt:
    pass
httpd.server_close()
print(time.asctime(),'Stop Server - %s:%s' %(HOST_NAME,PORT))

这里,我们有一条与服务器关联的数据(

self.myData
)。我们可以使用
self.server
属性在处理程序中引用它来访问服务器实例。

© www.soinside.com 2019 - 2024. All rights reserved.