0

我正在学习他们使用 BaseHTTPServer 的 python 课程。他们开始的代码在这里

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 类结合使用?

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

是否有可能做到这一点,如果是的话,有人可以给我一个提示如何做到这一点并为我提供一些基本的起始代码吗?

4

1 回答 1

1

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

另一方面,BaseHTTPServer两者都定义了一个接口,也有实际服务于 Web 请求的代码。

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

如今,WSGI 已经成为 python webapps 的事实标准,因此大多数用 python 编写的网站将服务器/接口-y 功能从 webapp-y 东西中接收和实现 WSGI 要求。

在您的代码中,您有一段代码既可以执行“webapp-y”,也可以执行“处理 http 请求/interface-y”。这并没有错,并且非常有助于对服务器如何处理 http 请求等有一些基本的了解。

所以我的建议是:

  1. 如果你的班级很快就会开始使用任何 python webapp 框架(例如:django、flask、、bottle、web2py、cherrypy 等),那么你可能会等到那时才使用 pythonanywhere。
  2. 如果你的课程专注于挖掘服务器的本质,你可以从你的代码中重构出“webapp-y”层,并在 PythonAnywhere 上使用“webapp-y”层。在本地,您将启动“服务器/接口-y”的东西,然后导入您的“webapp-y”以生成响应。如果你成功地做到了这一点,那么恭喜!您(有点)刚刚编写了一个支持 WSGI 的服务器
于 2015-05-20T13:19:23.327 回答