为什么我不需要在符合 WSGI 的应用程序中传递所需的 2 个位置参数?
Why I don't need to pass the required 2 positional arguments in WSGI-compliant apps?
这是我的 class:
class App(object):
def __init__(self, environ, start_response):
self.environ = environ
self.start_response = start_response
self.html = \
b"""
<html>
<head>
<title>Example App</title>
</head>
<body>
<h1>Example App is working!</h1>
</body>
</html>
"""
def __call__(self):
self.start_response("200 OK", [("Content-type", "text/html"),
('Content-Length', str(len(self.html)))])
return [self.html]
然后我运行它:
app = App()
我在 Apache 错误日志中收到类型错误(很明显):
TypeError: __init__() missing 2 required positional arguments: 'environ' and 'start_response'\r
问题是我看到的每个例子,他们就是不传递那些参数... This one for example:
class Hello(object):
def __call__(self, environ, start_response):
start_response('200 OK', [('Content-type','text/plain')])
return ['Hello World!']
hello = Hello() # ?????????????
如果每个示例都省略它们,我应该如何传递这些参数并避免类型错误?
您误读了 api 文档。您的 __init__
方法可以采用您想要的任何参数(在您的 App
示例中,您可能不需要除自身以外的任何参数)。那么你的__call__
方法就是需要有environ和start_response参数的方法,而且你不直接调用__call__
,WSGI服务器会调用。
这样的东西就是你想要的..
class App(object):
def __init__(self, name):
self.name = name
self.html = \
b"""
<html>
<head>
<title>{name}</title>
</head>
<body>
<h1>{name} is working!</h1>
</body>
</html>
""".format(name=self.name)
def __call__(self, environ, start_response):
start_response("200 OK", [("Content-type", "text/html"),
('Content-Length', str(len(self.html)))])
return [self.html]
app = App('Example App')
这是我的 class:
class App(object):
def __init__(self, environ, start_response):
self.environ = environ
self.start_response = start_response
self.html = \
b"""
<html>
<head>
<title>Example App</title>
</head>
<body>
<h1>Example App is working!</h1>
</body>
</html>
"""
def __call__(self):
self.start_response("200 OK", [("Content-type", "text/html"),
('Content-Length', str(len(self.html)))])
return [self.html]
然后我运行它:
app = App()
我在 Apache 错误日志中收到类型错误(很明显):
TypeError: __init__() missing 2 required positional arguments: 'environ' and 'start_response'\r
问题是我看到的每个例子,他们就是不传递那些参数... This one for example:
class Hello(object):
def __call__(self, environ, start_response):
start_response('200 OK', [('Content-type','text/plain')])
return ['Hello World!']
hello = Hello() # ?????????????
如果每个示例都省略它们,我应该如何传递这些参数并避免类型错误?
您误读了 api 文档。您的 __init__
方法可以采用您想要的任何参数(在您的 App
示例中,您可能不需要除自身以外的任何参数)。那么你的__call__
方法就是需要有environ和start_response参数的方法,而且你不直接调用__call__
,WSGI服务器会调用。
这样的东西就是你想要的..
class App(object):
def __init__(self, name):
self.name = name
self.html = \
b"""
<html>
<head>
<title>{name}</title>
</head>
<body>
<h1>{name} is working!</h1>
</body>
</html>
""".format(name=self.name)
def __call__(self, environ, start_response):
start_response("200 OK", [("Content-type", "text/html"),
('Content-Length', str(len(self.html)))])
return [self.html]
app = App('Example App')