内置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 服务器支持持久连接,这是 HTTP/1.1 中的默认设置,通过使用 Connection: Keep-Alive 标头实现。

  • 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 中路由的路由分发器

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 参数是连接路由的唯一名称。

  • route 是匹配 URI 的模式。

  • controller 是包含页面处理程序的实例。

  • 使用路由分发器连接匹配 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:

https://127.0.0.1:8080/generate?length=10

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

Routes Dispatcher
广告