Cherrypy - 内置 Http 服务器和内部引擎

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

Web 服务器充当网关与所有的请求和响应都保持在轨道上的帮助应用程序。

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

cherryPy.server.quickstart()

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

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

CherryPy - 配置

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

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

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 规范的编译,HTTP / 1.0 的支持随后在 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 headers 并根据请求相应地发送响应。

  • CherryPy 允许任何 HTTP 方法。

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

多线程应用程序服务器

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

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

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

其他选择包括 -

多进程模式

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

异步模式

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

URL 调度

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

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

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 - 访问以下网址 -

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

步骤 3 - 你将看到以下输出 -

路由调度器