使用Python搭建http服务器( 二 )


PaaS提供商会解决构建和运行HTTP服务中的出现的各种烦心事 。不需要再关心服务器 , 或者是提供IP地址之类的事情 。
PaaS会根据客户规模提供负载均衡器 。只需要给PaaS提供商提供配置文件即可完成各种复杂的步骤 。
现阶段比较常用的有Heroku和Docker 。
大多数PaaS提供商不支持静态内容 , 除非我们在Python应用程序中实现了对静态内容的更多支持或者向容器中加入了Apache或ngnix 。尽管我们可以将静态资源和动态页面的路径放在两个完全不同的URL空间内 , 但是许多架构师还是倾向于将两者放在同一个名字空间内 。
5、不使用Web框架编写WSGI可调用对象
下面第一段代码是用于返回当前时间的原始WSGI可调用对象 。
#!/usr/bin/env python3 # A simple HTTP service built directly against the low-level WSGI spec.import timedef app(environ, start_response):host = environ.get('HTTP_HOST', '127.0.0.1')path = environ.get('PATH_INFO', '/')if ':' in host:host, port = host.split(':', 1)if '?' in path:path, query = path.split('?', 1)headers = [('Content-Type', 'text/plain; charset=utf-8')]if environ['REQUEST_METHOD'] != 'GET':start_response('501 Not Implemented', headers)yield b'501 Not Implemented'elif host != '127.0.0.1' or path != '/':start_response('404 Not Found', headers)yield b'404 Not Found'else:start_response('200 OK', headers)yield time.ctime().encode('ascii') 第一段比较冗长 。下面使用第三方库简化原始WGSI的模式方法 。
第一个示例是使用WebOb编写的可调用对象返回当前时间 。
#!/usr/bin/env python3 # A WSGI callable built using webob.import time, webobdef app(environ, start_response):request = webob.Request(environ)if environ['REQUEST_METHOD'] != 'GET':response = webob.Response('501 Not Implemented', status=501)elif request.domain != '127.0.0.1' or request.path != '/':response = webob.Response('404 Not Found', status=404)else:response = webob.Response(time.ctime())return response(environ, start_response) 第二个是使用Werkzeug编写的WSGI可调用对象返回当前时间 。
#!/usr/bin/env python3 # A WSGI callable built using Werkzeug.import time from werkzeug.wrappers import Request, Response@Request.application def app(request):host = request.hostif ':' in host:host, port = host.split(':', 1)if request.method != 'GET':return Response('501 Not Implemented', status=501)elif host != '127.0.0.1' or request.path != '/':return Response('404 Not Found', status=404)else:return Response(time.ctime()) 大家可以对比这两个库在简化操作时的不同之处 , Werkzeug是Flask框架的基础 。




推荐阅读