PageSourceSearch

https://nonebot.dev/assets/js/0a69fddb.9155120e.js

js nonebot.dev collected 2026-10-03 23:18:55 UTC 12,338 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunknonebot=self.webpackChunknonebot||[]).push([["2994"],{30053(e,n,s){s.r(n),s.d(n,{metadata:()=>r,default:()=>h,frontMatter:()=>t,contentTitle:()=>c,toc:()=>l,assets:()=>o});var r=JSON.parse('{"id":"advanced/routing","title":"\u6DFB\u52A0\u8DEF\u7531","description":"\u6DFB\u52A0\u670D\u52A1\u7AEF\u8DEF\u7531\u89C4\u5219","source":"@site/versioned_docs/version-2.4.3/advanced/routing.md","sourceDirName":"advanced","slug":"/advanced/routing","permalink":"/docs/2.4.3/advanced/routing","draft":false,"unlisted":false,"editUrl":"https://github.com/nonebot/nonebot2/edit/master/website/versioned_docs/version-2.4.3/advanced/routing.md","tags":[],"version":"2.4.3","lastUpdatedBy":"pre-commit-ci[bot]","lastUpdatedAt":1789135437000,"sidebarPosition":9,"frontMatter":{"sidebar_position":9,"description":"\u6DFB\u52A0\u670D\u52A1\u7AEF\u8DEF\u7531\u89C4\u5219","options":{"menu":[{"category":"advanced","weight":100}]}},"sidebar":"tutorial","previous":{"title":"\u94A9\u5B50\u51FD\u6570","permalink":"/docs/2.4.3/advanced/runtime-hook"},"next":{"title":"\u4E8B\u4EF6\u54CD\u5E94\u5668\u5B58\u50A8","permalink":"/docs/2.4.3/advanced/matcher-provider"}}'),i=s(62540),d=s(43023);let t={sidebar_position:9,description:"\u6DFB\u52A0\u670D\u52A1\u7AEF\u8DEF\u7531\u89C4\u5219",options:{menu:[{category:"advanced",weight:100}]}},c="\u6DFB\u52A0\u8DEF\u7531",o={},l=[{value:"\u901A\u8FC7\u517C\u5BB9\u5C42\u6DFB\u52A0\u8DEF\u7531",id:"\u901A\u8FC7\u517C\u5BB9\u5C42\u6DFB\u52A0\u8DEF\u7531",level:2},{value:"HTTP \u8DEF\u7531",id:"http-\u8DEF\u7531",level:3},{value:"WebSocket \u8DEF\u7531",id:"websocket-\u8DEF\u7531",level:3},{value:"\u4F7F\u7528 ASGI \u5E94\u7528\u6DFB\u52A0\u8DEF\u7531",id:"\u4F7F\u7528-asgi-\u5E94\u7528\u6DFB\u52A0\u8DEF\u7531",level:2},{value:"\u83B7\u53D6 ASGI \u5E94\u7528",id:"\u83B7\u53D6-asgi-\u5E94\u7528",level:3},{value:"\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219",id:"\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219",level:3}];function a(e){let n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,d.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"\u6DFB\u52A0\u8DEF\u7531",children:"\u6DFB\u52A0\u8DEF\u7531"})}),"\n",(0,i.jsxs)(n.p,{children:["\u5728",(0,i.jsx)(n.a,{href:"/docs/2.4.3/advanced/driver",children:"\u9A71\u52A8\u5668"}),"\u4E00\u8282\u4E2D\uFF0C\u6211\u4EEC\u4E86\u89E3\u4E86\u9A71\u52A8\u5668\u7684\u4E24\u79CD\u7C7B\u578B\u3002\u65E2\u7136\u9A71\u52A8\u5668\u53EF\u4EE5\u4F5C\u4E3A\u670D\u52A1\u7AEF\u8FD0\u884C\uFF0C\u90A3\u4E48\u6211\u4EEC\u5C31\u53EF\u4EE5\u5411\u9A71\u52A8\u5668\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219\uFF0C\u4ECE\u800C\u5B9E\u73B0\u81EA\u5B9A\u4E49\u7684 API \u63A5\u53E3\u7B49\u529F\u80FD\u3002\u5728\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219\u65F6\uFF0C\u6211\u4EEC\u9700\u8981\u6CE8\u610F\u9A71\u52A8\u5668\u7684\u7C7B\u578B\uFF0C\u8BE6\u60C5\u53EF\u4EE5\u53C2\u8003",(0,i.jsx)(n.a,{href:"/docs/2.4.3/advanced/driver#%E9%85%8D%E7%BD%AE%E9%A9%B1%E5%8A%A8%E5%99%A8",children:"\u9009\u62E9\u9A71\u52A8\u5668"}),"\u3002"]}),"\n",(0,i.jsx)(n.p,{children:"NoneBot \u4E2D\uFF0C\u6211\u4EEC\u53EF\u4EE5\u901A\u8FC7\u4E24\u79CD\u9014\u5F84\u5411 ASGI \u9A71\u52A8\u5668\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219\uFF1A"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"\u901A\u8FC7 NoneBot \u7684\u517C\u5BB9\u5C42\u5EFA\u7ACB\u8DEF\u7531\u89C4\u5219\u3002"}),"\n",(0,i.jsx)(n.li,{children:"\u76F4\u63A5\u5411 ASGI \u5E94\u7528\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219\u3002"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"\u8FD9\u4E24\u79CD\u9014\u5F84\u5404\u6709\u4F18\u52A3\uFF0C\u524D\u8005\u53EF\u4EE5\u5728\u5404\u79CD\u670D\u52A1\u7AEF\u578B\u9A71\u52A8\u5668\u4E0B\u8FD0\u884C\uFF0C\u4F46\u5E76\u4E0D\u80FD\u76F4\u63A5\u4F7F\u7528 ASGI \u5E94\u7528\u6846\u67B6\u63D0\u4F9B\u7684\u7279\u6027\u4E0E\u529F\u80FD\uFF1B\u540E\u8005\u76F4\u63A5\u4F7F\u7528 ASGI \u5E94\u7528\uFF0C\u66F4\u81EA\u7531\u3001\u529F\u80FD\u5B8C\u6574\uFF0C\u4F46\u53EA\u80FD\u5728\u7279\u5B9A\u7C7B\u578B\u9A71\u52A8\u5668\u4E0B\u8FD0\u884C\u3002"}),"\n",(0,i.jsx)(n.p,{children:"\u5728\u5411\u9A71\u52A8\u5668\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219\u65F6\uFF0C\u6211\u4EEC\u9700\u8981\u6CE8\u610F\u9A71\u52A8\u5668\u662F\u5426\u4E3A\u670D\u52A1\u7AEF\u7C7B\u578B\uFF0C\u6211\u4EEC\u53EF\u4EE5\u901A\u8FC7\u4EE5\u4E0B\u65B9\u5F0F\u5224\u65AD\uFF1A"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"from nonebot import get_driver\nfrom nonebot.drivers import ASGIMixin\n\n# highlight-next-line\ncan_use = isinstance(get_driver(), ASGIMixin)\n"})}),"\n",(0,i.jsx)(n.h2,{id:"\u901A\u8FC7\u517C\u5BB9\u5C42\u6DFB\u52A0\u8DEF\u7531",children:"\u901A\u8FC7\u517C\u5BB9\u5C42\u6DFB\u52A0\u8DEF\u7531"}),"\n",(0,i.jsxs)(n.p,{children:["NoneBot \u517C\u5BB9\u5C42\u5B9A\u4E49\u4E86\u4E24\u4E2A\u6570\u636E\u7C7B ",(0,i.jsx)(n.code,{children:"HTTPServerSetup"})," \u548C ",(0,i.jsx)(n.code,{children:"WebSocketServerSetup"}),"\uFF0C\u5206\u522B\u7528\u4E8E\u5B9A\u4E49 HTTP \u670D\u52A1\u7AEF\u548C WebSocket \u670D\u52A1\u7AEF\u7684\u8DEF\u7531\u89C4\u5219\u3002"]}),"\n",(0,i.jsx)(n.h3,{id:"http-\u8DEF\u7531",children:"HTTP \u8DEF\u7531"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"HTTPServerSetup"})," \u5177\u6709\u56DB\u4E2A\u5C5E\u6027\uFF1A"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"path"}),"\uFF1A\u8DEF\u7531\u8DEF\u5F84\uFF0C\u4E0D\u652F\u6301\u7279\u6B8A\u5360\u4F4D\u8868\u8FBE\u5F0F\u3002\u7C7B\u578B\u4E3A ",(0,i.jsx)(n.code,{children:"URL"}),"\u3002"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"method"}),"\uFF1A\u8BF7\u6C42\u65B9\u6CD5\u3002\u7C7B\u578B\u4E3A ",(0,i.jsx)(n.code,{children:"str"}),"\u3002"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"name"}),"\uFF1A\u8DEF\u7531\u540D\u79F0\uFF0C\u4E0D\u53EF\u91CD\u590D\u3002\u7C7B\u578B\u4E3A ",(0,i.jsx)(n.code,{children:"str"}),"\u3002"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"handle_func"}),"\uFF1A\u8DEF\u7531\u5904\u7406\u51FD\u6570\u3002\u7C7B\u578B\u4E3A ",(0,i.jsx)(n.code,{children:"Callable[[Request], Awaitable[Response]]"}),"\u3002"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["\u4F8B\u5982\uFF0C\u6211\u4EEC\u6DFB\u52A0\u4E00\u4E2A ",(0,i.jsx)(n.code,{children:"/hello"})," \u7684\u8DEF\u7531\uFF0C\u5F53\u8BF7\u6C42\u65B9\u6CD5\u4E3A ",(0,i.jsx)(n.code,{children:"GET"})," \u65F6\uFF0C\u8FD4\u56DE ",(0,i.jsx)(n.code,{children:"200 OK"})," \u4EE5\u53CA\u8FD4\u56DE\u4F53\u4FE1\u606F\uFF1A"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'from nonebot import get_driver\nfrom nonebot.drivers import URL, Request, Response, ASGIMixin, HTTPServerSetup\n\n\nasync def hello(request: Request) ->
1 Response:\n    return Response(200, content="Hello, world!")\n\n\nif isinstance((driver := get_driver()), ASGIMixin):\n    driver.setup_http_server(\n        HTTPServerSetup(\n            path=URL("/hello"),\n            method="GET",\n            name="hello",\n            handle_func=hello,\n        )\n    )\n'})}),"\n",(0,i.jsxs)(n.p,{children:["\u5BF9\u4E8E ",(0,i.jsx)(n.code,{children:"Request"})," \u548C ",(0,i.jsx)(n.code,{children:"Response"})," \u7684\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u53EF\u4EE5\u53C2\u8003 ",(0,i.jsx)(n.a,{href:"/docs/2.4.3/api/drivers/",children:"API \u6587\u6863"}),"\u3002"]}),"\n",(0,i.jsx)(n.h3,{id:"websocket-\u8DEF\u7531",children:"WebSocket \u8DEF\u7531"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"WebSocketServerSetup"})," \u5177\u6709\u4E09\u4E2A\u5C5E\u6027\uFF1A"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"path"}),"\uFF1A\u8DEF\u7531\u8DEF\u5F84\uFF0C\u4E0D\u652F\u6301\u7279\u6B8A\u5360\u4F4D\u8868\u8FBE\u5F0F\u3002\u7C7B\u578B\u4E3A ",(0,i.jsx)(n.code,{children:"URL"}),"\u3002"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"name"}),"\uFF1A\u8DEF\u7531\u540D\u79F0\uFF0C\u4E0D\u53EF\u91CD\u590D\u3002\u7C7B\u578B\u4E3A ",(0,i.jsx)(n.code,{children:"str"}),"\u3002"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"handle_func"}),"\uFF1A\u8DEF\u7531\u5904\u7406\u51FD\u6570\u3002\u7C7B\u578B\u4E3A ",(0,i.jsx)(n.code,{children:"Callable[[WebSocket], Awaitable[Any]]"}),"\u3002"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["\u4F8B\u5982\uFF0C\u6211\u4EEC\u6DFB\u52A0\u4E00\u4E2A ",(0,i.jsx)(n.code,{children:"/ws"})," \u7684\u8DEF\u7531\uFF0C\u53D1\u9001\u6240\u6709\u63A5\u6536\u5230\u7684\u6570\u636E\uFF1A"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'from nonebot import get_driver\nfrom nonebot.drivers import URL, ASGIMixin, WebSocket, WebSocketServerSetup\n\n\nasync def ws_handler(ws: WebSocket):\n    await ws.accept()\n    try:\n        while True:\n            data = await ws.receive()\n            await ws.send(data)\n    except WebSocketClosed as e:\n        # handle closed\n        ...\n    finally:\n        with contextlib.suppress(Exception):\n            await websocket.close()\n        # do some cleanup\n\n\nif isinstance((driver := get_driver()), ASGIMixin):\n    driver.setup_websocket_server(\n        WebSocketServerSetup(\n            path=URL("/ws"),\n            name="ws",\n            handle_func=ws_handler,\n        )\n    )\n'})}),"\n",(0,i.jsxs)(n.p,{children:["\u5BF9\u4E8E ",(0,i.jsx)(n.code,{children:"WebSocket"})," \u7684\u8BE6\u7EC6\u4FE1\u606F\uFF0C\u53EF\u4EE5\u53C2\u8003 ",(0,i.jsx)(n.a,{href:"/docs/2.4.3/api/drivers/",children:"API \u6587\u6863"}),"\u3002"]}),"\n",(0,i.jsx)(n.h2,{id:"\u4F7F\u7528-asgi-\u5E94\u7528\u6DFB\u52A0\u8DEF\u7531",children:"\u4F7F\u7528 ASGI \u5E94\u7528\u6DFB\u52A0\u8DEF\u7531"}),"\n",(0,i.jsx)(n.h3,{id:"\u83B7\u53D6-asgi-\u5E94\u7528",children:"\u83B7\u53D6 ASGI \u5E94\u7528"}),"\n",(0,i.jsxs)(n.p,{children:["NoneBot \u670D\u52A1\u7AEF\u7C7B\u578B\u7684\u9A71\u52A8\u5668\u5177\u6709\u4E24\u4E2A\u5C5E\u6027 ",(0,i.jsx)(n.code,{children:"server_app"})," \u548C ",(0,i.jsx)(n.code,{children:"asgi"}),"\uFF0C\u5206\u522B\u5BF9\u5E94\u9A71\u52A8\u6846\u67B6\u5E94\u7528\u548C ASGI \u5E94\u7528\u3002\u901A\u5E38\u60C5\u51B5\u4E0B\uFF0C\u8FD9\u4E24\u4E2A\u5E94\u7528\u662F\u540C\u4E00\u4E2A\u5BF9\u8C61\u3002\u6211\u4EEC\u53EF\u4EE5\u901A\u8FC7 ",(0,i.jsx)(n.code,{children:"get_app()"})," \u65B9\u6CD5\u5FEB\u901F\u83B7\u53D6\uFF1A"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"import nonebot\n\napp = nonebot.get_app()\nasgi = nonebot.get_asgi()\n"})}),"\n",(0,i.jsx)(n.h3,{id:"\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219",children:"\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219"}),"\n",(0,i.jsxs)(n.p,{children:["\u5728\u83B7\u53D6\u5230\u4E86 ASGI \u5E94\u7528\u540E\uFF0C\u6211\u4EEC\u5C31\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 ASGI \u5E94\u7528\u6846\u67B6\u63D0\u4F9B\u7684\u529F\u80FD\u6765\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219\u4E86\u3002\u8FD9\u91CC\u6211\u4EEC\u4EE5 ",(0,i.jsx)(n.a,{href:"/docs/2.4.3/advanced/driver#fastapi%E9%BB%98%E8%AE%A4",children:"FastAPI"})," \u4E3A\u4F8B\uFF0C\u6F14\u793A\u5982\u4F55\u6DFB\u52A0\u8DEF\u7531\u89C4\u5219\u3002"]}),"\n",(0,i.jsxs)(n.p,{children:["\u5728\u4E0B\u9762\u7684\u4EE3\u7801\u4
1E2D\uFF0C\u6211\u4EEC\u6DFB\u52A0\u4E86\u4E00\u4E2A ",(0,i.jsx)(n.code,{children:"GET"})," \u7C7B\u578B\u7684 ",(0,i.jsx)(n.code,{children:"/api"})," \u8DEF\u7531\uFF0C\u5177\u4F53\u65B9\u6CD5\u53C2\u8003 ",(0,i.jsx)(n.a,{href:"https://fastapi.tiangolo.com/",children:"FastAPI \u6587\u6863"}),"\u3002"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'import nonebot\nfrom fastapi import FastAPI\n\napp: FastAPI = nonebot.get_app()\n\n\[email protected]("/api")\nasync def custom_api():\n    return {"message": "Hello, world!"}\n'})})]})}function h(e={}){let{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},43023(e,n,s){s.d(n,{R:()=>t,x:()=>c});var r=s(63696);let i={},d=r.createContext(i);function t(e){let n=r.useContext(d);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(d.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.