Web 服务器

当 Evennia 启动时,它还会启动其基于 Twisted 的 Web 服务器。Web 服务器负责提供游戏网站的 HTML 页面,也可以提供静态资源,如图像和音乐。

Web 客户端作为 Evennia 的 Server 进程的一部分运行。这意味着它可以直接访问游戏中修改的缓存对象,并且不会有处理数据库中暂时不同步对象的风险。

Web 服务器基于 Twisted,旨在用于生产环境。它利用了 Django Web 框架,并提供以下功能:

  • 游戏网站 - 当你访问 localhost:4001 时看到的内容。网站的外观应根据你的游戏进行定制。用户登录网站后,如果通过 Web 客户端登录游戏,将自动登录游戏,因为它们共享相同的登录凭据(无法安全地对 Telnet 客户端进行自动登录)。

  • Web 管理 基于 Django Web 管理,允许你在图形界面中编辑游戏数据库。

  • Web 客户端 页面由 Web 服务器提供,但实际的游戏通信(发送/接收数据)是通过页面上的 JavaScript 客户端直接打开到 Evennia Portal 的 WebSocket 连接完成的。

  • Evennia REST-API 允许从游戏外部访问数据库(仅在 REST_API_ENABLED=True 时)。

基本 Web 服务器数据流

  1. 用户在浏览器中输入 URL(或点击按钮)。这会导致浏览器向服务器发送一个包含 URL 路径的 HTTP 请求(例如,对于 https://localhost:4001/,我们需要考虑的 URL 部分是 /)。其他可能的路径包括 /admin//login//channels/ 等。

  2. Evennia(通过 Django)将使用注册在 urls.py 文件中的正则表达式。这充当了到 视图 的重路由器,视图是能够处理传入请求的常规 Python 函数或可调用类(可以将这些视图类似于选择正确的 Evennia 命令来处理你的输入——在这个意义上,视图就像命令)。在 / 的情况下,我们重路由到处理网站主页的视图。

  3. 视图代码将准备网页所需的所有数据。对于默认的主页,这意味着收集游戏统计信息,以便你可以看到当前有多少人连接到游戏等。

  4. 视图接下来将获取一个 模板。模板是一个带有特殊“占位符”标签(通常写作 {{...}}{% ... %})的 HTML 文档。这些占位符允许视图将动态内容注入 HTML 中,使页面根据当前情况进行定制。对于主页,这意味着在 HTML 页面的正确位置注入当前的玩家数量。这称为“渲染”模板。结果是一个完整的 HTML 页面。

  5. (视图还可以以类似方式拉入一个 表单 来定制用户输入。)

  6. 完成的 HTML 页面被打包到一个 HTTP 响应 中并返回到 Web 浏览器,浏览器现在可以显示页面了!

关于 Web 客户端的说明

Web 浏览器还可以直接执行代码,而无需与服务器通信。这些代码必须写入/加载到网页中,并使用 JavaScript 编程语言编写(这是无法避免的,因为这是 Web 浏览器理解的语言)。执行 JavaScript 是 Web 浏览器的工作,它独立于 Evennia 运行。可以在页面上使用小段 JavaScript 来使按钮响应、制作小动画等,这些操作不需要服务器。

对于 Web 客户端,Evennia 将按上述方式加载 Web 客户端页面,但页面随后会启动负责实际显示客户端 GUI 的 JavaScript 代码,允许你调整窗口大小等。

启动后,Web 客户端会“呼叫主机”并启动一个到 Evennia Portal 的 WebSocket 链接——这就是所有数据交换的方式。因此,在 Web 客户端页面的初始加载后,直到关闭标签页并返回或在浏览器中手动重新加载之前,上述序列不会再次发生。