Python中如何向wsgiref应用传递自定义参数且不使用全局变量
WSGI应用无全局变量传入自定义参数的实现方案
已知WSGI应用的标准定义签名为
def application(environ, start_response):,规范要求environ变量不允许随意添加自定义参数,需在不使用全局变量的前提下实现自定义参数传入。
方法1:使用闭包封装自定义变量
定义外层函数接收自定义参数,返回符合WSGI签名的内层应用函数,内层函数可以直接访问外层函数作用域内的自定义变量,生命周期和应用一致。
代码示例:
def create_application(custom_var1, custom_var2): # 内层函数符合WSGI标准签名 def application(environ, start_response): # 直接使用外层传入的自定义变量 response_body = f"自定义变量1: {custom_var1}, 自定义变量2: {custom_var2}".encode() status = "200 OK" headers = [("Content-Type", "text/plain; charset=utf-8")] start_response(status, headers) return [response_body] return application # 初始化时传入自定义参数,得到符合标准的WSGI应用 app = create_application("测试值1", "测试值2")
方法2:使用可调用类实例存储自定义变量
定义实现了__call__方法的类,__init__方法接收自定义参数并存储为实例属性,__call__方法遵循WSGI标准签名,调用时可以直接访问实例内存储的自定义变量。
代码示例:
class CustomWSGIApp: def __init__(self, custom_var1, custom_var2): # 初始化时接收自定义参数存入实例属性 self.custom_var1 = custom_var1 self.custom_var2 = custom_var2 def __call__(self, environ, start_response): # __call__方法符合WSGI标准签名 response_body = f"自定义变量1: {self.custom_var1}, 自定义变量2: {self.custom_var2}".encode() status = "200 OK" headers = [("Content-Type", "text/plain; charset=utf-8")] start_response(status, headers) return [response_body] # 实例化时传入自定义参数,得到符合标准的WSGI应用 app = CustomWSGIApp("测试值1", "测试值2")
方法3:使用偏函数绑定自定义参数
借助functools.partial提前为接收自定义参数的通用WSGI函数绑定固定参数值,得到的新函数仅保留environ和start_response两个参数,符合WSGI标准签名要求。
代码示例:
from functools import partial # 通用WSGI函数,先接收自定义参数再接收标准WSGI参数 def general_application(custom_var1, custom_var2, environ, start_response): response_body = f"自定义变量1: {custom_var1}, 自定义变量2: {custom_var2}".encode() status = "200 OK" headers = [("Content-Type", "text/plain; charset=utf-8")] start_response(status, headers) return [response_body] # 用partial绑定自定义参数,得到符合标准的WSGI应用 app = partial(general_application, "测试值1", "测试值2")
内容的提问来源于stack exchange,提问作者wojciech-graj
相关产品推荐
相关产品推荐

