Discuss / Python / 打卡,有个地方没太明白

打卡,有个地方没太明白

Topic source

application函数里调用了一个start_response函数,请问这个函数是在哪里定义的啊?

李赛艇

#2 Created at ... [Delete] [Delete and Lock User]

服务器提供的

ywjco_567

#3 Created at ... [Delete] [Delete and Lock User]

start_response(status, headers) 及self.write的代码:

有个牛人写了个WSGI协议的翻译,学学这个就好。

参考:PEP 333 - Python Web Server Gateway Interface v1.0 中文版

def start_response(self, status, headers,exc_info=None):
        """'start_response()' callable as specified by PEP 333"""

        if exc_info:
            try:
                if self.headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0], exc_info[1], exc_info[2]
            finally:
                exc_info = None        # avoid dangling circular ref
        elif self.headers is not None:
            raise AssertionError("Headers already set!")

        assert type(status) is StringType,"Status must be a string"
        assert len(status)>=4,"Status must be at least 4 characters"
        assert int(status[:3]),"Status message must begin w/3-digit code"
        assert status[3]==" ", "Status message must have a space after code"
        if __debug__:
            for name,val in headers:
                assert type(name) is StringType,"Header names must be strings"
                assert type(val) is StringType,"Header values must be strings"
                assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed"

        self.status = status
        self.headers = self.headers_class(headers)
        return self.write



    def write(data):
        if not headers_set:
             raise AssertionError("write() before start_response()")

        elif not headers_sent:
             # 在第一次输出之前发送已存储的报头。
             status, response_headers = headers_sent[:] = headers_set
             sys.stdout.write('Status: %s\r\n' % status)
             for header in response_headers:
                 sys.stdout.write('%s: %s\r\n' % header)
             sys.stdout.write('\r\n')

        sys.stdout.write(data)
        sys.stdout.flush()

  • 1

Reply