Feature: 细化 driver 职责类型 (#2296)

This commit is contained in:
Ju4tCode
2023-08-26 11:03:24 +08:00
committed by GitHub
parent 807a86371d
commit 2e635370bb
20 changed files with 632 additions and 284 deletions

View File

@ -22,21 +22,22 @@ options:
## 驱动器类型
驱动器类型两种:
驱动器类型大体上可以分为两种:
- `ForwardDriver`:即客户端型驱动器,多用于使用 HTTP 轮询,连接 WebSocket 服务器等情形。
- `ReverseDriver`:即服务端型驱动器,多用于使用 WebHook接收 WebSocket 客户端连接等情形。
- `Forward`:即客户端型驱动器,多用于使用 HTTP 轮询,连接 WebSocket 服务器等情形。
- `Reverse`:即服务端型驱动器,多用于使用 WebHook接收 WebSocket 客户端连接等情形。
客户端型驱动器具有以下两种功能
客户端型驱动器可以分为以下两种:
1. 异步发送 HTTP 请求,自定义 `HTTP Method``URL``Header``Body``Cookie``Proxy``Timeout` 等。
2. 异步建立 WebSocket 连接上下文,自定义 `WebSocket URL``Header``Cookie``Proxy``Timeout` 等。
服务端型驱动器通常为 ASGI 应用框架,具有以下功能
服务端型驱动器目前有
1. 协议适配器自定义 HTTP 上报地址以及对上报数据处理的回调函数。
2. 协议适配器自定义 WebSocket 连接请求地址以及对 WebSocket 请求处理的回调函数。
3. 用户可以向 ASGI 应用添加任何服务端相关功能,如:[添加自定义路由](./routing.md)
1. ASGI 应用框架,具有以下功能:
- 协议适配器自定义 HTTP 上报地址以及对上报数据处理的回调函数。
- 协议适配器自定义 WebSocket 连接请求地址以及对 WebSocket 请求处理的回调函数
- 用户可以向 ASGI 应用添加任何服务端相关功能,如:[添加自定义路由](./routing.md)。
## 配置驱动器
@ -79,7 +80,7 @@ DRIVER=~none
### FastAPI默认
**类型:**服务端驱动器
**类型:**ASGI 服务端驱动器
> FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints.
@ -185,7 +186,7 @@ nonebot.run(app="bot:app")
### Quart
**类型:**`ReverseDriver`
**类型:**ASGI 服务端驱动器
> Quart is an asyncio reimplementation of the popular Flask microframework API.
@ -249,7 +250,7 @@ nonebot.run(app="bot:app")
### HTTPX
**类型:**`ForwardDriver`
**类型:**HTTP 客户端驱动器
:::warning 注意
本驱动器仅支持 HTTP 请求,不支持 WebSocket 连接请求。
@ -263,7 +264,7 @@ DRIVER=~httpx
### websockets
**类型:**`ForwardDriver`
**类型:**WebSocket 客户端驱动器
:::warning 注意
本驱动器仅支持 WebSocket 连接请求,不支持 HTTP 请求。
@ -277,7 +278,7 @@ DRIVER=~websockets
### AIOHTTP
**类型:**`ForwardDriver`
**类型:**HTTP/WebSocket 客户端驱动器
> [AIOHTTP](https://docs.aiohttp.org/): Asynchronous HTTP Client/Server for asyncio and Python.

View File

@ -12,7 +12,7 @@ options:
在[驱动器](./driver.md)一节中,我们了解了驱动器的两种类型。既然驱动器可以作为服务端运行,那么我们就可以向驱动器添加路由规则,从而实现自定义的 API 接口等功能。在添加路由规则时,我们需要注意驱动器的类型,详情可以参考[选择驱动器](./driver.md#配置驱动器)。
NoneBot 中,我们可以通过两种途径向驱动器添加路由规则:
NoneBot 中,我们可以通过两种途径向 ASGI 驱动器添加路由规则:
1. 通过 NoneBot 的兼容层建立路由规则。
2. 直接向 ASGI 应用添加路由规则。
@ -23,9 +23,9 @@ NoneBot 中,我们可以通过两种途径向驱动器添加路由规则:
```python {3}
from nonebot import get_driver
from nonebot.drivers import ReverseDriver
from nonebot.drivers import ASGIMixin
can_use = isinstance(get_driver(), ReverseDriver)
can_use = isinstance(get_driver(), ASGIMixin)
```
## 通过兼容层添加路由
@ -45,12 +45,12 @@ NoneBot 兼容层定义了两个数据类 `HTTPServerSetup` 和 `WebSocketServer
```python
from nonebot import get_driver
from nonebot.drivers import URL, Request, Response, HTTPServerSetup
from nonebot.drivers import URL, Request, Response, ASGIMixin, HTTPServerSetup
async def hello(request: Request) -> Response:
return Response(200, content="Hello, world!")
if isinstance((driver := get_driver()), ReverseDriver):
if isinstance((driver := get_driver()), ASGIMixin):
driver.setup_http_server(
HTTPServerSetup(
path=URL("/hello"),
@ -75,7 +75,7 @@ if isinstance((driver := get_driver()), ReverseDriver):
```python
from nonebot import get_driver
from nonebot.drivers import URL, WebSocket, WebSocketServerSetup
from nonebot.drivers import URL, ASGIMixin, WebSocket, WebSocketServerSetup
async def ws_handler(ws: WebSocket):
await ws.accept()
@ -91,7 +91,7 @@ async def ws_handler(ws: WebSocket):
await websocket.close()
# do some cleanup
if isinstance((driver := get_driver()), ReverseDriver):
if isinstance((driver := get_driver()), ASGIMixin):
driver.setup_websocket_server(
WebSocketServerSetup(
path=URL("/ws"),

View File

@ -125,8 +125,8 @@ NoneBot 提供了多种 [Driver](../advanced/driver) 来帮助适配器进行网
import asyncio
from typing_extensions import override
from nonebot.drivers import Request, ForwardDriver
from nonebot.exception import WebSocketClosed
from nonebot.drivers import Request, WebSocketClientMixin
class Adapter(BaseAdapter):
@override
@ -137,11 +137,11 @@ class Adapter(BaseAdapter):
self.setup()
def setup(self) -> None:
if not isinstance(self.driver, ForwardDriver):
if not isinstance(self.driver, WebSocketClientMixin):
# 判断用户配置的Driver类型是否符合适配器要求不符合时应抛出异常
raise RuntimeError(
f"Current driver {self.config.driver} doesn't support forward connections!"
f"{self.get_name()} Adapter need a ForwardDriver to work."
f"Current driver {self.config.driver} doesn't support websocket client connections!"
f"{self.get_name()} Adapter need a WebSocket Client Driver to work."
)
# 在 NoneBot 启动和关闭时进行相关操作
self.driver.on_startup(self.startup)
@ -202,8 +202,8 @@ class Adapter(BaseAdapter):
```python {30,38} title=adapter.py
from nonebot.drivers import (
Request,
ASGIMixin,
WebSocket,
ReverseDriver,
HTTPServerSetup,
WebSocketServerSetup
)
@ -216,10 +216,10 @@ class Adapter(BaseAdapter):
self.setup()
def setup(self) -> None:
if not isinstance(self.driver, ReverseDriver):
if not isinstance(self.driver, ASGIMixin):
raise RuntimeError(
f"Current driver {self.config.driver} doesn't support forward connections!"
f"{self.get_name()} Adapter need a ReverseDriver to work."
f"Current driver {self.config.driver} doesn't support asgi server!"
f"{self.get_name()} Adapter need a asgi server driver to work."
)
# 建立服务端路由
# HTTP Webhook 路由