使用Python搭建http服务器

来源:ROR体育App下载作者:ROR体育App下载 日期:2021-11-19 浏览:
本文摘要:David Wheeler有一句名言:“盘算机科学中的任何问题,都可以通过加上另一层间接的中间层解决。”为了提高Python网络服务的可移植性,Python社区在PEP 333中提出了Web服务器网关接口(WSGI,Web Server Gateway Interface)。为了提高Python网络服务的可移植性,Python社区在PEP 333中提出了Web服务器网关接口(WSGI,Web Server Gateway Interface)。

ROR体育

David Wheeler有一句名言:“盘算机科学中的任何问题,都可以通过加上另一层间接的中间层解决。”为了提高Python网络服务的可移植性,Python社区在PEP 333中提出了Web服务器网关接口(WSGI,Web Server Gateway Interface)。为了提高Python网络服务的可移植性,Python社区在PEP 333中提出了Web服务器网关接口(WSGI,Web Server Gateway Interface)。

WSGL尺度就是添加了一层中间层。通过这一其中间层,用Python编写的HTTP服务就能够与任何Web服务器举行交互了。

现在,WSGI已经成为了使用Python举行HTTP操作的尺度方法。根据尺度的界说,WSGI应用法式是可以被挪用的,而且有两个输入参数。1、WSGI下面是第一段代码,第一个参数是environ,用于吸收一个字典,字典中提供的键值对是旧式的CGI情况荟萃的拓展。第二个参数自己也是可以被挪用的,习惯上会将其命名为start_response(),WSGI应用法式通过这个参数来声明响应头信息。

# 用WSGI应用形式编写的简朴HTTP服务。#!/usr/bin/env python3 # A simple HTTP service built directly against the low-level WSGI spec. from pprint import pformat from wsgiref.simple_server import make_server def app(environ, start_response): headers = {'Content-Type': 'text/plain; charset=utf-8'} start_response('200 OK', list(headers.items())) yield 'Here is the WSGI environment: '.encode('utf-8') yield pformat(environ).encode('utf-8') if __name__ == '__main__': httpd = make_server('', 8000, app) host, port = httpd.socket.getsockname() print('Serving on', host, 'port', port) httpd.serve_forever() 上述只是一个简朴的情况。可是在编写服务器法式时,庞大度就大大提升了。

这是因为要完全思量尺度中的形貌的许多注意点和界限情况。2、前向署理与反向署理无论前向署理还是反向署理,HTTP署理其实就是一个HTTP服务器,用于吸收请求,然后对吸收到的请求(至少是部门请求)举行转发。转发请求时署理会饰演客户端的角色,将转发的HTTP请求发送至真正的服务器,最后将从服务器接受到的响应发挥饰演客户端的角色,将转发的请求发送至真正的服务器,最后将从服务器接受到的响应发回给最初的客户端。

ROR体育App下载

下面是前向署理和反向署理的简图。反向署理已经广泛应用于大型的HTTP服务当中。反向署理是Web服务的一部门,对于HTTP客户端并不行见。3、四种架构架构师一般都使用许多种庞大的机制来将多个子模块组合建成一个HTTP服务。

现在在Python社区中,已经形成了4种基本的模式。如果已经编写了用于生成动态内容的Python代码,而且已经选择了某个支持WSGI的API或框架,应该如何将HTTP服务部署到线上呢?运行一个使用Python编写的服务器,服务器的代码中可以直接挪用WSGI接口。

现在最盛行的是Green Unicorn(Gunicorn)服务器,不外也有其他已经可以用于生产情况的纯Python服务器。设置mod_wsgi并运行Apache,在一个独立的WSFIDaemonProcess中运行Python代码,由mod_wsgi启动守护历程。在后端运行一个类似于Gunicorn的Python HTTP服务器(或者支持所选异步框架的任何服务器),然后在前端运行一个既能返回静态文件,又能对Python编写的动态资源服务举行反向署理的Web服务器。

在最前端运行一个纯粹的反向署理(如Varnish),在该反向署理后端运行Apache或者nginx,在后端运行Python编写的HTTP服务器。这是一个三层的架构。

这些反向署理可以漫衍在差别的地理位置,这样子就能够将离客户端最近的反向署理上的缓存资源返回给发送请求的客户端。恒久以来,对这4个架构的选择主要基于CPython的3个运行时的特性,即解释器占用内存大、解释器运行慢、全局解释器(GIL,Global Interpreter Lock)克制多个线程同时运行Python字节码。

ROR体育App下载

但同时带来了内存中只能载入一定数量的Python实例。4、平台即服务这个观点的泛起是因为现在的自动化部署、连续集成以及高性能大规模服务的相关技术的泛起和处置惩罚有一些繁杂。所以有一些提供商提出了PaaS(Platform as a Service),现在只需体贴应该如何打包自己的应用法式,以便将自己的应用部署到这些服务之上。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 time def 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, webob def 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.host if ':' 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框架的基础。


本文关键词:使用,Python,搭建,http,服务器,David,ROR体育App下载,Wheeler,有

本文来源:ROR体育-www.shhonggui.com

0
无法在这个位置找到: foot.htm