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