Sanic 简介#
安装:
pip install sanic
Sanic 拥有你所需的所有工具,用于可扩展的生产级服务器——开箱即用!包括完整的 TLS 支持。
from sanic import Sanic
from sanic.response import text
app = Sanic("MyHelloWorldApp")
@app.get("/")
async def hello_world(request):
return text("Hello, world.")
每个请求处理器可以是同步的(
def hello_world
)或异步的(async def hello_world
)。除非你有明确的理由,否则总是选择async
。request
对象总是处理器的第一个参数。其他框架将其作为上下文变量传递。在async
世界中,这样做效果不佳,明确表达会更容易(更不用说更清晰、性能更好)。你必须使用响应类型。许多其他框架允许你有这样的返回值:
return "Hello, world."
或这样:return {"foo": "bar"}
。但是,为了进行这种隐式调用,链条中的某处需要花费宝贵的时间来尝试确定你的意图。因此,为了这种便利性,Sanic 决定要求显式调用。
将上面的文件保存为 server.py
。然后启动它
sanic server
备注
这是另一个重要的区别。其他框架带有内置的开发服务器,并明确表示它仅用于开发用途。Sanic 则恰恰相反。
打包的服务器是可以直接用于生产环境的。
可以在 jupyter notebook 中展示:
import asyncio
server = await app.create_server(host='localhost', port=8000, debug=True)
await server.startup()
# await server.serve_forever()
[2024-01-24 10:32:17 +0000] [694] [DEBUG]
Sanic
Build Fast. Run Fast.
[2024-01-24 10:32:17 +0000] [694] [INFO] Sanic v23.12.1
[2024-01-24 10:32:17 +0000] [694] [INFO] Goin' Fast @ http://localhost:8000
[2024-01-24 10:32:17 +0000] [694] [INFO] app: MyHelloWorldApp
[2024-01-24 10:32:17 +0000] [694] [INFO] mode: debug, single worker
[2024-01-24 10:32:17 +0000] [694] [INFO] server: sanic, HTTP/1.1
[2024-01-24 10:32:17 +0000] [694] [INFO] python: 3.10.13
[2024-01-24 10:32:17 +0000] [694] [INFO] platform: Linux-5.19.0-1028-aws-x86_64-with-glibc2.31
[2024-01-24 10:32:17 +0000] [694] [INFO] packages: sanic-routing==23.12.0, sanic-ext==23.12.0
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
Cell In[2], line 2
1 import asyncio
----> 2 server = await app.create_server(host='localhost', port=8000, debug=True)
3 await server.startup()
4 # await server.serve_forever()
File ~/checkouts/readthedocs.org/user_builds/sanic-book/envs/latest/lib/python3.10/site-packages/sanic/mixins/startup.py:612, in StartupMixin.create_server(self, host, port, debug, ssl, sock, protocol, backlog, access_log, unix, return_asyncio_server, asyncio_server_kwargs, noisy_exceptions)
606 if main_start or main_stop:
607 logger.warning(
608 "Listener events for the main process are not available "
609 "with create_server()"
610 )
--> 612 return await serve(
613 asyncio_server_kwargs=asyncio_server_kwargs, **server_settings
614 )
File ~/checkouts/readthedocs.org/user_builds/sanic-book/envs/latest/lib/python3.10/site-packages/sanic/server/async_server.py:113, in AsyncioServer.__await__(self)
111 while not task.done():
112 yield
--> 113 self.server = task.result()
114 return self
File ~/.asdf/installs/python/3.10.13/lib/python3.10/asyncio/base_events.py:1519, in BaseEventLoop.create_server(self, protocol_factory, host, port, family, flags, sock, backlog, ssl, reuse_address, reuse_port, ssl_handshake_timeout, start_serving)
1517 sock.bind(sa)
1518 except OSError as err:
-> 1519 raise OSError(err.errno, 'error while attempting '
1520 'to bind on address %r: %s'
1521 % (sa, err.strerror.lower())) from None
1522 completed = True
1523 finally:
OSError: [Errno 99] error while attempting to bind on address ('::1', 8000, 0, 0): cannot assign requested address
也可以直接启动:
sanic path.to.server:app
Sanic 插件简介#
Sanic 有意追求简洁和中立的特性列表。该项目不希望要求你以某种特定方式构建你的应用程序,并尽量避免规定特定的开发模式。有许多由社区构建和维护的第三方插件,用于添加不符合核心仓库要求的其他功能。
然而,为了帮助 API 开发者,Sanic 组织维护了名为 Sanic Extensions 的官方插件,提供各种好东西,包括:
使用 Redoc 和/或 Swagger 的 OpenAPI 文档
CORS 保护
路由处理器中的依赖注入
请求查询参数和正文输入验证
自动创建
HEAD
、OPTIONS
和TRACE
端点预定义的、特定于端点的响应序列化器
设置的首选方法是与 Sanic 一起安装,但您也可以单独安装这些软件包。
pip install sanic[ext]
从 v21.12 开始,如果 Sanic Extensions 与 Sanic 在同一个环境中,Sanic 将自动设置 Sanic Extensions。您还将访问两个额外的应用程序属性:
app.extend()
- 用于配置 Sanic Extensionsapp.ext
- 附加到应用程序的 Extend 实例