为什么我不需要在符合 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')