0

我在使用BaseHTTPServer的Python课程。他们下手的代码是here在Python中将BaseHttpServer连接到WSGI

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的任何地方,那里唯一可能获得的应用程序在互联网上是使用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,我必须同时接口。我估计它可能有可能是从BaseHTTPServer派生的wsgi,所以它可能可以连接它们并在pythonanywhere.com上使用我的课程。

很明显,我必须摆脱主代码中的代码,改用应用程序功能。但我并不完全明白这是如何工作的。我收到一个回调(start_response),我打电话,然后我产生内容?我怎样才能将它与webServerHandler类结合起来?

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

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

+1

如果你能评论为什么downvote,那么我会改善这个问题。 –

+0

我在查看你的问题,当你编辑它,我认为你改善了你的问题(我没有投票你顺便说一句)。另外一个建议是包含您收到的任何错误消息。 –

回答

1

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

另一方面,BaseHTTPServer都定义了一个接口,并且还具有实际提供Web请求的代码。

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

如今,WSGI有become the de facto standard为蟒蛇的webapps,所以大多数用Python编写的网站上分离出接收并实现从Web应用程序-Y的东西WSGI要求服务器/接口-Y功能。

在你的代码中,你有一段代码既执行“webapp-y”,也执行“处理http请求/接口-y”的东西。这没有错,对于理解服务器如何处理http请求等非常有用。

所以我的建议是:

  1. 如果你的类将开始使用任何的Python web应用框架很快anywahs(例如:Django的,瓶,瓶,web2py中,CherryPy的等等),那么你可以可能只是等到使用pythonanywhere。
  2. 如果您的课程专注于深入研究服务器的基本特性,您可以从代码中重构出“webapp-y”图层,并使用PythonAnywhere上的“webapp-y”图层。在本地,您将启动“server/interface-y”,然后导入您的“webapp-y”以生成响应。如果你成功地做到了这一点,那么恭喜!你有(只)写了一个server that supports WSGI
+0

谢谢,我会等到班上要用烧瓶,我知道在pyhonanywhere工作得很好。我发现了一个晚上的临时修复,那就是使用云9平台,我只需要直接访问端口8080并获得代码工作。我会接受你的回答。 –