技术开发 频道

CherryPy入门之Web服务器篇

  【IT168 技术】近几年来,Web应用程序以指数方式增长,同时也催生了大量的工具包、程序库和框架以帮助使用不同编程语言的Web开发人员来简化他们的开发任务。CherryPy是一种为Python开发人员准备的Web应用程序开发框架,通俗点说,就是一个Python程序库,它为Python开发人员提供了友好的HTTP协议接口。大家知道,HTTP可是万维网的支柱协议,而CherryPy将HTTP协议简化成Python API来供Python 开发人员使用,这极大地简化了Web开发人员对HTTP协议的操作。本文将对CherryPy内建的web服务器做深入的介绍。

  一、CherryPy有关的基本概念

  我们常说,CherryPy是一种Web应用程序服务器。为了讲解这句话,我们需要先弄清楚几个基本的概念:Web服务器、应用程序、应用程序服务器和Web应用程序服务器。下面对这些概念分别加以解释。

  我们首先介绍Web服务器。所谓Web服务器,就是处理HTTP协议的接口一个软件,它将收到的HTTP请求传给应用服务器,并把应用服务器返回的信息转换成HTTP响应。

  那什么是应用程序和应用程序服务器呢?所谓应用程序是这样一个软件,它取得一段信息,按照商业逻辑进行相应的处理,并返回处理后的信息。而应用程序服务器则是托管一个或多个应用程序的组件。

  最后,我们介绍Web应用程序服务器。所谓Web应用程序服务器,只不过是融合了Web服务器和应用服务器的单个组件。从下面开始,我们介绍CherryPy内建的Web服务器。

  二、CherryPy内置的Web服务器

  CherryPy自身内置了一个HTTP服务器,或者称为Web服务器。这样,对于CherryPy的用户来说,不用另外搭设Web服务器就能直接运行CherryPy应用程序了。实际上,Web服务器是到达CherryPy应用程序的关口,是所有的HTTP请求和响应的必经之地。因此,可以这样理解CherryPy内建的Web服务器:它是位于处理客户端与服务器端之间的一层软件,用于把底层TCP套按字传输的信息转换成Http请求,并传递给相应的处理程序;同时,还把上层软件传来的信息打包成Http响应,并向下传递给底层的TCP套按字。

  为了启用内置的Web服务器,必须使用下列代码:

  cherrypy.server.quickstart()

  虽然CherryPy提供了内置的Web服务器,但是这并不是说只能使用其内置服务器,相反,如果需要的话,CherryPy也可以使用其他Web服务器。

  三、CherryPy支持的HTTP版本

  CherryPy经过不断的发展,现在已经能兼容几乎所有的HTTP规范:从最初支持的HTTP/1.0到HTTP/1.1。 对于HTTP/1.1,CherryPy兼容它的大部分所需特性,但是并非与其规范完全兼容。具体而言,CherryPy支持HTTP/1.1以下的特性:

  1. CherryPy允许所有的HTTP方法。

  2. CherryPy能正确处理大块的请求和响应。

  3. 如果客户端声称支持HTTP/1.1,它必须在所有用该版本的协议制作的请求中包含Host报头字段;否则,CherryPy将立即终止该请求的处理,并发送400错误代码消息。

  4. CherryPy会在所有配置中生成一个Date头域。

  5. CherryPy支持设置了If-Modified-Since和If-Unmodified-Since头部的请求,并能进行适当地响应。

  6. CherryPy在支持HTTP 1.1客户端上处理Continue响应状态码(100)。该状态代码表示临时的响应。我们知道,客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。100表示初始的请求已经接受,客户应当继续发送请求的其余部分。

  7. CherryPy的内置HTTP服务器支持在HTTP/1.1中默认的持久连接,方法是使用Connection: Keep-Alive 头。此外,如果所选择的服务器不支持这种功能的话,更改HTTP服务器可以取消这个兼容性。

  8. CherryPy能够支持客户端和服务器之间的所有HTTP版本组合。

  总的说来,由于支持HTTP/1.1,CherryPy 3提供了大量功能,因此可以是在各种情形下安心的使用。

  四、启用多个HTTP服务器

  上面介绍了启动CherryPy内建Web服务器的方法,不过要说明的是,默认时CherryPy只会启动单个内建HTTP服务器的实例,不过,如果您需要在单个Python进程中使用不同的网络接口来运行应用程序的话,该怎么办呢?别急,CherryPy提供了一个API,通过它可以在单个进程中运行不同的HTTP服务器实例。

  首先,让我们考察一下CherryPy服务器通常是如何启动的:

 

conf = {'global': {'server.socket_port': 100100,
'
server.socket_host': 'localhost'}}
cherrypy.config.update(conf)
cherrypy.server.quickstart()

  如您所见,我们调用了该服务器的quickstart()方法,这将实例化内置的HTTP服务器,并在一个单独的线程中启动它。现在,假设我们具有这样的一个应用程序,我们希望该程序运行在不同的网络接口上,那么可以使用下列代码达此目的:

 

from cherrypy import _cpwsgi
#在192.
169.10.12接口的100100端口上创建一个服务器
s1
= _cpwsgi.CPWSGIServer()
s1.bind_addr
= ('192.169.10.12', 100100)
#在192.169.10.27接口的4700端口上创建一个服务器
s2
= _cpwsgi.CPWSGIServer()
s2.bind_addr
= ('192.169.10.27', 4700)
#通知CherryPy要启动和使用哪些服务器
cherrypy.server.httpservers
= {s1: ('192.169.10.12', 100100),
s2: ('192.169.10.27', 4700)}
cherrypy.server.start()

  如您所见,我们首先创建了两个内置HTTP服务器的实例,并分别为它们设置了捆绑地址以侦听入局的请求。接下来,我们把这两个服务器附加到CherryPy的http服务器池中,然后调用start()方法在相应的接口上启动它们。注意,我们没有调用cherrypy.config.update ,因为它会更新所有的服务器共享的全局配置设置。不过,这不是一个真正的问题,因为可以给每个内置服务器的实例设置相应的属性,因此:

 

s1.socket_port = 100100
s1.socket_host
= '192.169.10.12'
s1.socket_file = ''
s1.socket_queue_size = 5
s1.socket_timeout
= 20
s1.protocol_version
= 'HTTP/1.1'
s1.reverse_dns = False
s1.thread_pool
= 20
s1.max_request_header_size
= 500 * 1024
s1.max_request_body_size
= 100 * 1024 * 1024
s1.ssl_certificate
= None
s1.ssl_private_key
= None

  像上面这样,您可以直接配置服务器实例的设置,从而避免使用全局配置。对于同时使用HTTP和HTTPS的应用程序来说,这样技术同样适用。

  五、小结

  CherryPy是一种为Python开发人员准备的Web应用程序开发框架,通俗点说,就是一个Python程序库,它为Python开发人员提供了友好的HTTP协议接口。大家知道,HTTP可是万维网的支柱协议,而CherryPy将HTTP协议简化成Python API来供Python 开发人员使用,这极大地简化了Web开发人员对HTTP协议的操作。本文对CherryPy内建的web服务器启动方法、所支持的协议做深入的介绍,最后我们还对如何启用多个内建的Web服务器做了详细的讲解,希望本文对您的学习有所帮助。

0
相关文章