Evennia REST API

Evennia 通过 REST API 使其数据库可访问,如果使用默认设置在本地运行,可以在 http://localhost:4001/api 找到。该 API 允许你从游戏外部检索、编辑和创建资源,例如使用你自己的自定义客户端或游戏编辑器。虽然你可以在网页浏览器中查看和了解 API,但它实际上是为其他程序在代码中访问而设计的。

该 API 使用 Django Rest Framework。这自动化了设置 视图(Python 代码)以处理网页请求结果的过程。检索数据的过程与 Webserver 页面上解释的类似,只不过这里的视图将返回你想要的资源的 JSON 数据。你也可以 发送 这样的 JSON 数据以从外部更新数据库。

使用方法

要激活 API,请在你的设置文件中添加以下内容:

REST_API_ENABLED = True

主要的控制设置是 REST_FRAMEWORK,这是一个字典。键 DEFAULT_LIST_PERMISSIONDEFAULT_CREATE_PERMISSIONS 分别控制谁可以通过 API 查看和创建新对象。默认情况下,具有 ‘Builder’-level permission 或更高权限的用户可以访问这两种操作。

虽然 API 是为了扩展而设计的,但 Evennia 提供了一些开箱即用的操作。如果你点击 /api 网站右上角的 Autodoc 按钮,你会看到一个可用端点的精美图形展示。

以下是在 Python 中使用标准 requests 库调用 API 的示例:

>>> import requests
>>> response = requests.get("https://www.mygame.com/api", auth=("MyUsername", "password123"))
>>> response.json()
{'accounts': 'http://www.mygame.com/api/accounts/',
 'objects': 'http://www.mygame.com/api/objects/',
 'characters': 'http://www.mygame.com/api/characters/',
 'exits': 'http://www.mygame.com/api/exits/',
 'rooms': 'http://www.mygame.com/api/rooms/',
 'scripts': 'http://www.mygame.com/api/scripts/',
 'helpentries': 'http://www.mygame.com/api/helpentries/'}

要列出特定类型的对象:

>>> response = requests.get("https://www.mygame.com/api/objects",
                            auth=("Myusername", "password123"))
>>> response.json()
{
"count": 125,
"next": "https://www.mygame.com/api/objects/?limit=25&offset=25",
"previous": null,
"results" : [{"db_key": "A rusty longsword", "id": 57, "db_location": 213, ...}]}

在上面的示例中,现在在 “results” 数组中显示对象,同时它有一个 “count” 值表示总对象数,以及 “next” 和 “previous” 链接用于下一页和上一页(如果有)。这称为 分页,链接显示 “limit” 和 “offset” 作为查询参数,可以添加到 URL 中以控制输出。

其他查询参数可以定义为 过滤器,允许你进一步缩小结果范围。例如,仅获取具有开发者权限的账户:

>>> response = requests.get("https://www.mygame.com/api/accounts/?permission=developer",
                            auth=("MyUserName", "password123"))
>>> response.json()
{
"count": 1,
"results": [{"username": "bob",...}]
}

现在假设你想使用 API 创建一个 Object

>>> data = {"db_key": "A shiny sword"}
>>> response = requests.post("https://www.mygame.com/api/objects",
                             data=data, auth=("Anotherusername", "mypassword"))
>>> response.json()
{"db_key": "A shiny sword", "id": 214, "db_location": None, ...}

在这里,我们向 /api/objects 端点发出了一个 HTTP POST 请求,带有我们想要的 db_key。我们收到了新创建对象的信息。你现在可以使用 PUT(替换所有内容)或 PATCH(仅替换你提供的内容)进行另一个请求。通过将 id 提供给端点(/api/objects/214),我们确保更新正确的剑:

>>> data = {"db_key": "An even SHINIER sword", "db_location": 50}
>>> response = requests.put("https://www.mygame.com/api/objects/214",
                            data=data, auth=("Anotherusername", "mypassword"))
>>> response.json()
{"db_key": "An even SHINIER sword", "id": 214, "db_location": 50, ...}

在大多数情况下,你不会用 Python 向后端发出 API 请求,而是通过某个前端应用程序使用 JavaScript 发出请求。有许多 JavaScript 库可以简化从前端发出请求的过程,例如 AXIOS,或使用原生的 Fetch

定制 API

总体而言,阅读 Django Rest Framework ViewSets 和其文档的其他部分是扩展和定制 API 的必要条件。

查看 Website 页面,了解如何覆盖代码、模板和静态文件。

  • API 模板(用于网页显示)位于 evennia/web/api/templates/rest_framework/(必须命名为这样以允许覆盖原始 REST 框架模板)。

  • 静态文件位于 evennia/web/api/static/rest_framework/

  • API 代码位于 evennia/web/api/ - 这里的 url.py 文件负责收集所有视图类。

与其他网页组件不同,mygame/web/api/ 没有预先设置的 urls.py。这是因为模型与 API 的注册与 REST API 功能紧密集成。最简单的方法可能是复制 evennia/web/api/urls.py 并在原地修改。