1 介绍
1.1 官方介绍
Sanic 是 Python3.7+ Web 服务器和 Web 框架,旨在提高性能。它允许使用 Python3.5 中添加的 async
/await
语法,这使得您的代码有效的避免阻塞从而达到提升响应速度的目的。
Sanic 不仅仅是一个 框架,它还是一个 Web 服务器。
github: https://github.com/couragesteak/python_web_framework_sanic
教程地址:https://www.couragesteak.com/article/331
1.2 特征
- 内置极速 web server
- 生产准备就绪
- 极高的拓展性
- 支持 ASGI
- 简单直观的 API 设计
- 社区保障
2 快速入门
2.1 Hello World
pip install sanic
快速搭建一个Hello World
from sanic import Sanic, json
app = Sanic("my_demo")
@app.route("/")
async def index(request):
return json({"code": 1, "msg": "Hello World"})
if __name__ == "__main__":
app.run(host="127.0.0.1", port=8089, debug=True)
注意:
-
每个请求都可以使用 同步/异步的方式进行声明,但更推荐统一使用异步。
- def index()
- async def index()
-
request对象采用了显示传递,作为响应函数的第一个参数,而其他框架需要导入上下文。
-
在Sanic中,必须使用 Response
或继承子Response
的类型作为响应类型
2.3 应用程序上下文 Application context
大多数程序都需要夸代码库的共享/重用数据或对象,最常见的就是数据库连接。
在Sanic V21.3 版本以前,是将属性附加到应用程序实现的:
app = Sanic("MyApp")
app.db = Database()
到了 V21.3版本,官方引入了 应用级上下文对象,这有效避免了命名成图的潜在问题。
app = Sanic("MyApp")
app.ctx.db = Database()
实例
@app.middleware("request")
async def inject_session(request):
# 写入
request.ctx.db_name = "test"
# 读取
db = request.db_name.db
2.3 请求 Request
2.3.1 请求体 json/raw/form/uploaded
1、json
curl 127.0.0.1:8000 -d '{"name": "couragesteak"}'
name = await request_post_arg(request, "name")
2、raw
请求正文中原始字节
2.2 Sanic 扩展
单独安装方法
pip install sanic[ext]
pip install sanic-ext
从 V21.12开始,Sanic将自动设置Sanic扩展。
- app.extend() :用于配置Sanic扩展
- app.ext :注入到应用程序的扩展实例
<h2><a id="1__0"></a>1 介绍</h2>
<h3><a id="11__2"></a>1.1 官方介绍</h3>
<p>Sanic 是 Python3.7+ Web 服务器和 Web 框架,旨在提高性能。它允许使用 Python3.5 中添加的 <code>async</code>/<code>await</code> 语法,这使得您的代码有效的避免阻塞从而达到提升响应速度的目的。</p>
<p>Sanic 不仅仅是一个 <strong>框架</strong>,它还是一个 <strong>Web 服务器</strong>。</p>
<p>github: <a href="https://github.com/couragesteak/python_web_framework_sanic" target="_blank">https://github.com/couragesteak/python_web_framework_sanic</a></p>
<p>教程地址:<a href="https://www.couragesteak.com/article/331" target="_blank">https://www.couragesteak.com/article/331</a></p>
<h3><a id="12__14"></a>1.2 特征</h3>
<ul>
<li>内置极速 web server</li>
<li>生产准备就绪</li>
<li>极高的拓展性</li>
<li>支持 ASGI</li>
<li>简单直观的 API 设计</li>
<li>社区保障</li>
</ul>
<h2><a id="2__25"></a>2 快速入门</h2>
<h3><a id="21_Hello_World_27"></a>2.1 Hello World</h3>
<pre><div class="hljs"><code class="lang-shell">pip install sanic
</code></div></pre>
<p>快速搭建一个Hello World</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> sanic <span class="hljs-keyword">import</span> Sanic, json
app = Sanic(<span class="hljs-string">"my_demo"</span>)
<span class="hljs-comment"># http://127.0.0.1:8089</span>
<span class="hljs-meta">@app.route(<span class="hljs-params"><span class="hljs-string">"/"</span></span>)</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">def</span> <span class="hljs-title function_">index</span>(<span class="hljs-params">request</span>):
<span class="hljs-keyword">return</span> json({<span class="hljs-string">"code"</span>: <span class="hljs-number">1</span>, <span class="hljs-string">"msg"</span>: <span class="hljs-string">"Hello World"</span>})
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
app.run(host=<span class="hljs-string">"127.0.0.1"</span>, port=<span class="hljs-number">8089</span>, debug=<span class="hljs-literal">True</span>)
<span class="hljs-comment"># app.run(host="0.0.0.0", port=80)</span>
</code></div></pre>
<p>注意:</p>
<ul>
<li>
<p>每个请求都可以使用 同步/异步的方式进行声明,但更推荐统一使用异步。</p>
<ul>
<li>def index()</li>
<li>async def index()</li>
</ul>
</li>
<li>
<p>request对象采用了显示传递,作为响应函数的第一个参数,而其他框架需要导入上下文。</p>
</li>
<li>
<p>在Sanic中,必须使用 <code>Response</code>或继承子<code>Response</code>的类型作为响应类型</p>
</li>
</ul>
<h3><a id="23__Application_context_61"></a>2.3 应用程序上下文 Application context</h3>
<p>大多数程序都需要夸代码库的<strong>共享/重用数据或对象</strong>,最常见的就是数据库连接。</p>
<p>在Sanic V21.3 版本以前,是将属性附加到应用程序实现的:</p>
<pre><div class="hljs"><code class="lang-python">app = Sanic(<span class="hljs-string">"MyApp"</span>)
app.db = Database()
</code></div></pre>
<p>到了 V21.3版本,官方引入了 应用级上下文对象,这有效避免了命名成图的潜在问题。</p>
<pre><div class="hljs"><code class="lang-python">app = Sanic(<span class="hljs-string">"MyApp"</span>)
app.ctx.db = Database()
</code></div></pre>
<p>实例</p>
<pre><div class="hljs"><code class="lang-shell">@app.middleware("request")
async def inject_session(request):
# 写入
request.ctx.db_name = "test"
# 读取
db = request.db_name.db
</code></div></pre>
<h3><a id="23__Request_97"></a>2.3 请求 Request</h3>
<h4><a id="231__jsonrawformuploaded_99"></a>2.3.1 请求体 json/raw/form/uploaded</h4>
<p>1、json</p>
<pre><div class="hljs"><code class="lang-shell">curl 127.0.0.1:8000 -d '{"name": "couragesteak"}'
</code></div></pre>
<pre><div class="hljs"><code class="lang-python">name = <span class="hljs-keyword">await</span> request_post_arg(request, <span class="hljs-string">"name"</span>)
</code></div></pre>
<p>2、raw</p>
<p>请求正文中原始字节</p>
<h3><a id="22_Sanic__117"></a>2.2 Sanic 扩展</h3>
<p>单独安装方法</p>
<pre><div class="hljs"><code class="lang-shell">pip install sanic[ext]
pip install sanic-ext
</code></div></pre>
<p>从 V21.12开始,Sanic将自动设置Sanic扩展。</p>
<ul>
<li>app.extend() :用于配置Sanic扩展</li>
<li>app.ext :注入到应用程序的扩展实例</li>
</ul>
留言