📜  内置Http服务器和内部引擎

📅  最后修改于: 2020-10-26 05:21:29             🧑  作者: Mango


CherryPy带有自己的Web(HTTP)服务器。这就是为什么CherryPy是自包含的,并允许用户在获取库后的几分钟内运行CherryPy应用程序的原因。

Web服务器充当应用程序的网关,借助该网关,所有请求和响应都保持在正确的状态。

要启动Web服务器,用户必须进行以下调用-

cherryPy.server.quickstart()

CherryPy内部引擎负责以下活动-

  • 创建和管理请求和响应对象。
  • 控制和管理CherryPy流程。

CherryPy –配置

该框架带有其自己的配置系统,允许您参数化HTTP服务器。可以将配置设置存储在语法接近INI格式的文本文件中,也可以将其存储为完整的Python字典。

要配置CherryPy服务器实例,开发人员需要使用设置的global部分。

global_conf = {
   'global': {
      'server.socket_host': 'localhost',
      'server.socket_port': 8080,
   },
}

application_conf = {
   '/style.css': {
      'tools.staticfile.on': True,
      'tools.staticfile.filename': os.path.join(_curdir, 'style.css'),
   }
}

This could be represented in a file like this:
[global]
server.socket_host = "localhost"
server.socket_port = 8080
[/style.css]
tools.staticfile.on = True
tools.staticfile.filename = "/full/path/to.style.css"

HTTP合规性

CherryPy的发展缓慢,但是在HTTP / 1.0的支持下它包括HTTP规范的编译,后来在HTTP / 1.1的支持下进行了转移。

据说CherryPy有条件地符合HTTP / 1.1,因为它实现了规范的所有必需和必需级别,但不是所有应有的级别。因此,CherryPy支持HTTP / 1.1的以下功能-

  • 如果客户端声称支持HTTP / 1.1,则它必须在使用指定协议版本发出的任何请求中发送标头字段。如果未完成,CherryPy将立即停止处理请求。

  • CherryPy生成一个在所有配置中使用的Date头字段。

  • CherryPy可以在客户的支持下处理响应状态代码(100)。

  • CherryPy的内置HTTP服务器通过使用Connection:Keep-Alive标头来支持HTTP / 1.1中默认的持久连接。

  • CherryPy处理正确的分块的请求和响应。

  • CherryPy以两种不同的方式支持请求-If-Modified-Since和If-Unmodified-Since标头,并根据请求相应地发送响应。

  • CherryPy允许任何HTTP方法。

  • CherryPy处理客户端和服务器设置之间的HTTP版本组合。

多线程应用服务器

CherryPy是基于多线程概念设计的。每次开发人员在CherryPy名称空间中获取或设置一个值时,它都是在多线程环境中完成的。

cherrypy.request和cherrypy.response都是线程数据容器,这意味着您的应用程序通过在运行时知道通过它们代理了哪个请求来独立调用它们。

使用线程模式的应用程序服务器未被高度重视,因为线程的使用被视为增加了由于同步要求而引起问题的可能性。

其他替代方案包括-

多进程模式

每个请求均由其自己的Python进程处理。在这里,服务器的性能和稳定性可以被认为是更好的。

异步模式

在这里,接受新连接并将数据发送回客户端是从请求过程异步完成的。该技术以其效率而闻名。

URL调度

CherryPy社区希望更加灵活,希望为调度员提供其他解决方案。 CherryPy 3提供了其他内置的调度程序,并提供了一种编写和使用自己的调度程序的简单方法。

  • 用于开发HTTP方法的应用程序。 (GET,POST,PUT等)
  • 定义URL中的路由的一个-Routes Dispatcher

HTTP方法分派器

在某些应用程序中,URI独立于服务器将在资源上执行的动作。

例如, http://xyz.com/album/delete/10

URI包含客户端希望执行的操作。

默认情况下,CherryPy调度程序将以以下方式映射-

album.delete(12)

正确提到了上述调度程序,但可以通过以下方式使其独立-

http://xyz.com/album/10

用户可能想知道服务器如何调度确切的页面。该信息由HTTP请求本身携带。当从客户端到服务器的请求时,CherryPy看起来是最合适的处理程序,该处理程序表示URI目标资源。

DELETE /album/12 HTTP/1.1

路线调度员

这是分派所需方法的参数列表-

  • name参数是要连接的路由的唯一名称。

  • 路由是匹配URI的模式。

  • 控制器是包含页面处理程序的实例。

  • 使用Routes调度程序可以连接与URI匹配并关联特定页面处理程序的模式。

让我们以一个例子来了解它是如何工作的-

import random
import string
import cherrypy

class StringMaker(object):
   @cherrypy.expose
   def index(self):
      return "Hello! How are you?"
   
   @cherrypy.expose
   def generate(self, length=9):
      return ''.join(random.sample(string.hexdigits, int(length)))
        
if __name__ == '__main__':
   cherrypy.quickstart(StringMaker ())

请按照以下给出的步骤获取上述代码的输出-

步骤1-将上述文件另存为tutRoutes.py

步骤2-访问以下URL-

http://localhost:8080/generate?length=10

步骤3-您将收到以下输出-

路线调度员