mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-07-28 00:31:14 +00:00
✨ Feature: 细化 driver 职责类型 (#2296)
This commit is contained in:
@ -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.
|
||||
|
||||
|
@ -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"),
|
||||
|
@ -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 路由
|
||||
|
Reference in New Issue
Block a user