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 保护

  • 路由处理器中的依赖注入

  • 请求查询参数和正文输入验证

  • 自动创建 HEADOPTIONSTRACE 端点

  • 预定义的、特定于端点的响应序列化器

设置的首选方法是与 Sanic 一起安装,但您也可以单独安装这些软件包。

pip install sanic[ext]

从 v21.12 开始,如果 Sanic Extensions 与 Sanic 在同一个环境中,Sanic 将自动设置 Sanic Extensions。您还将访问两个额外的应用程序属性:

  • app.extend() - 用于配置 Sanic Extensions

  • app.ext - 附加到应用程序的 Extend 实例