在 python 中将 BaseHttpServer 连接到 WSGI

Interfacing BaseHttpServer to WSGI in python

我正在参加 python 他们使用 BaseHTTPServer 的课程。他们开始的代码是 here

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class webServerHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        try:
            if self.path.endswith("/hello"):
                 self.send_response(200)
                 self.send_header('Content-type', 'text/html')
                 self.end_headers()
                 message = ""
                 message += "<html><body>Hello!</body></html>"
                 self.wfile.write(message)
                 print message
                 return
        except IOError:
            self.send_error(404, 'File Not Found: %s' % self.path)

def main():
    try:
        port = 8080
        server = HTTPServer(('', port), webServerHandler)
        print "Web Server running on port %s"  % port
        server.serve_forever()
    except KeyboardInterrupt:
        print " ^C entered, stopping web server...."
        server.socket.close()

if __name__ == '__main__':
    main()

我在任何地方都使用 python,而将应用程序放到 Internet 上的唯一可能是使用 wsgi 接口。

wsgi 接口的配置文件如下所示:

import sys

path = '<path to app>'
if path not in sys.path:
    sys.path.append(path)

from app import application

申请可以是这样的:

def application(environ, start_response):
    if environ.get('PATH_INFO') == '/':
        status = '200 OK'
        content = HELLO_WORLD
    else:
        status = '404 NOT FOUND'
        content = 'Page not found.'
    response_headers = [('Content-Type', 'text/html'), ('Content-Length', str(len(content)))]
    start_response(status, response_headers)
    yield content.encode('utf8')

HELLO_WORLD 将是一个包含 html 内容的字符串。

我不能像示例中那样只指向端口 8080。为了在任何地方使用 python 我必须连接两者。我认为 wsgi 可能是从 BaseHTTPServer 派生的,因此可以将它们连接起来并在 pythonanywhere.com

上使用我的课程

很明显,我必须摆脱 main 函数中的代码,而改用 application 函数。但我并不完全了解它是如何工作的。我收到一个回调 (start_response),我调用它然后生成内容?我怎样才能将它与 webServerHandler class?

结合起来

如果这是可能的,理论上它应该也适用于 google 应用程序引擎。我找到了一个非常复杂的示例 here,其中使用了 BaseHTTPServer 但这对我来说太复杂了。

是否可以执行此操作,如果可以,有人可以提示我如何执行此操作并提供一些基本的启动代码吗?

所以 WSGI 是一个 specification,它定义了请求和 webapp 之间的接口。 IE。当它收到一个 http 请求时,它会以规范中描述的标准化方式将它传递给 webapp(例如:它必须设置这个环境变量,它必须传递这个参数,它必须进行这个调用等)。

另一方面,BaseHTTPServer既定义了一个接口,也有实际服务网络请求的代码。

  • 这是一个很少使用的接口,几乎完全由 python2 标准库中的 SimpleHTTPServer(或 python3 中的 http.server)实现,服务器是不适用于任何生产就绪的东西。
  • 这是因为SimpleHTTPServer主要是为本地开发而设计的。例如,它可以帮助您解决 testing on localhost.
  • 时的 js 跨源请求问题

现在,WSGI 有 become the de facto standard 用于 python 网络应用程序,因此大多数用 python 编写的网站将接收和实现 WSGI 要求的服务器/接口功能从webapp-y 的东西。

在您的代码中,您有一段代码既可以执行 "webapp-y" 操作,也可以执行 "process the http request / interface-y" 操作。这没有错,对于了解服务器如何处理 http 请求等有一些基本的了解非常有用

所以我的建议是:

  1. 如果您的 class 即将开始使用任何 python webapp 框架(例如:django、flask、bottle、web2py、cherrypy 等),那么您可以等待到那时才能在任何地方使用 python。
  2. 如果您的 class 专注于挖掘服务器的本质,您可以从代码中重构出 "webapp-y" 层,然后只使用 PythonAnywhere 上的 "webapp-y" 层.在本地,您将启动 "server/interface-y" 内容,然后导入您的 "webapp-y" 以生成响应。如果你成功地做到了这一点,那么恭喜你!您(有点)刚刚写了一个 server that supports WSGI.