<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sanic</title>
	<atom:link href="https://techgrowup.net/tag/sanic/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Sat, 21 Dec 2024 15:13:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>sanic</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python開発入門48 Sanicフレームワーク入門</title>
		<link>https://techgrowup.net/python-sanic/</link>
					<comments>https://techgrowup.net/python-sanic/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 21 Dec 2024 15:13:03 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sanic]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2236</guid>

					<description><![CDATA[はじめに Sanicは、Pythonで高速な非同期Webアプリケーションを構築するための軽量Webフレームワークです。非同期I/O（asyncio）を活用して高いパフォーマンスを実現し、リクエスト処理の並列性を最大限に引 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"><strong>はじめに</strong></h1>



<p class="wp-block-paragraph">Sanicは、Pythonで高速な非同期Webアプリケーションを構築するための軽量Webフレームワークです。非同期I/O（asyncio）を活用して高いパフォーマンスを実現し、リクエスト処理の並列性を最大限に引き出すことが可能です。</p>



<p class="wp-block-paragraph">この記事では、Sanicの基本的な使い方や構造、実際のコード例を通じて、その特長と応用方法を解説します。</p>



<h2 class="wp-block-heading"><strong>Sanicとは</strong></h2>



<h3 class="wp-block-heading"><strong>Sanicの概要</strong></h3>



<p class="wp-block-paragraph">Sanicは、Pythonのasyncioをベースにした<strong>非同期Webフレームワーク</strong>です。以下のような特徴を持っています：</p>



<ul class="wp-block-list">
<li>高速なリクエスト処理性能（非同期I/Oによる並列処理）。</li>



<li>シンプルなAPI設計で、初心者にも扱いやすい。</li>



<li>WebSocketやストリーミングなどのリアルタイム通信機能をサポート。</li>
</ul>



<h3 class="wp-block-heading"><strong>Sanicの主な特徴</strong></h3>



<ol class="wp-block-list">
<li><strong>非同期I/Oを最大限に活用</strong><br>asyncioを基盤としており、高速で効率的なリクエスト処理を実現します。</li>



<li><strong>シンプルな設計</strong><br>Flaskに似た直感的な設計で、学習コストが低いのが特徴です。</li>



<li><strong>高いスケーラビリティ</strong><br>大量の同時接続を処理するWebアプリケーションの構築に適しています。</li>



<li><strong>リアルタイム通信対応</strong><br>WebSocketやストリーミングのサポートで、リアルタイム機能を簡単に実装可能です。</li>
</ol>



<h2 class="wp-block-heading"><strong>Sanicのインストールとセットアップ</strong></h2>



<h3 class="wp-block-heading"><strong>Sanicのインストール</strong></h3>



<p class="wp-block-paragraph">以下のコマンドでSanicをインストールします：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="pip install sanic" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pip</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">sanic</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>インストール確認</strong></h3>



<p class="wp-block-paragraph">以下のコードを実行してSanicのバージョンを確認します：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="from sanic import __version__
print(__version__)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> sanic </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">__version__</span></span>
<span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">__version__</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>Sanicアプリケーションの基本構造</strong></h2>



<p class="wp-block-paragraph">Sanicアプリケーションの基本構造は、以下のコンポーネントで構成されます：</p>



<ol class="wp-block-list">
<li><strong>アプリケーションの作成</strong></li>



<li><strong>ルーティングの定義</strong></li>



<li><strong>リクエストハンドラーの作成</strong></li>



<li><strong>アプリケーションの起動</strong></li>
</ol>



<h3 class="wp-block-heading"><strong>基本構造の例</strong></h3>



<p class="wp-block-paragraph">以下は、Sanicアプリケーションのシンプルな例です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="from sanic import Sanic
from sanic.response import json

app = Sanic(&quot;MyApp&quot;)

@app.route(&quot;/&quot;)
async def handle_request(request):
    return json({&quot;message&quot;: &quot;Hello, Sanic!&quot;})

if __name__ == &quot;__main__&quot;:
    app.run(host=&quot;0.0.0.0&quot;, port=8000)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> sanic </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> Sanic</span></span>
<span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> sanic.response </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> json</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">app = Sanic(</span><span style="color: #CE9178">&quot;MyApp&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handle_request</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json({</span><span style="color: #CE9178">&quot;message&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Hello, Sanic!&quot;</span><span style="color: #D4D4D4">})</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">__name__</span><span style="color: #D4D4D4"> == </span><span style="color: #CE9178">&quot;__main__&quot;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    app.run(</span><span style="color: #9CDCFE">host</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;0.0.0.0&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">port</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">8000</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph"><strong>説明：</strong></p>



<ol class="wp-block-list">
<li><strong>アプリケーションの作成</strong><br><code>Sanic("MyApp")</code>でアプリケーションを作成します。</li>



<li><strong>ルート定義</strong><br><code>@app.route("/")</code>でルート<code>/</code>へのGETリクエストを定義します。</li>



<li><strong>非同期ハンドラー</strong><br>非同期関数<code>handle_request</code>でリクエストを処理します。</li>



<li><strong>アプリの起動</strong><br><code>app.run</code>でアプリケーションを起動します。</li>
</ol>



<h2 class="wp-block-heading"><strong>Sanicの主要機能</strong></h2>



<h3 class="wp-block-heading"><strong>非同期リクエスト処理</strong></h3>



<p class="wp-block-paragraph">Sanicは非同期I/Oを活用してリクエストを効率的に処理します。</p>



<h6 class="wp-block-heading"><strong>例：非同期関数の使用</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import asyncio

@app.route(&quot;/async&quot;)
async def async_handler(request):
    await asyncio.sleep(1)  # 非同期タスク
    return json({&quot;message&quot;: &quot;非同期処理が完了しました&quot;})" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> asyncio</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/async&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">async_handler</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> asyncio.sleep(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 非同期タスク</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json({</span><span style="color: #CE9178">&quot;message&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;非同期処理が完了しました&quot;</span><span style="color: #D4D4D4">})</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>URLパラメータとクエリ文字列</strong></h3>



<p class="wp-block-paragraph">SanicではURLパラメータやクエリ文字列を簡単に扱えます。</p>



<h6 class="wp-block-heading"><strong>例：URLパラメータの取得</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@app.route(&quot;/user/&lt;name&gt;&quot;)
async def greet_user(request, name):
    return json({&quot;message&quot;: f&quot;こんにちは、{name}さん！&quot;})" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/user/&lt;name&gt;&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">greet_user</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json({</span><span style="color: #CE9178">&quot;message&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;こんにちは、</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">name</span><span style="color: #569CD6">}</span><span style="color: #CE9178">さん！&quot;</span><span style="color: #D4D4D4">})</span></span></code></pre></div>



<h6 class="wp-block-heading"><strong>例：クエリ文字列の取得</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@app.route(&quot;/search&quot;)
async def search(request):
    query = request.args.get(&quot;q&quot;, &quot;デフォルト&quot;)
    return json({&quot;query&quot;: query})" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/search&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">search</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    query = request.args.get(</span><span style="color: #CE9178">&quot;q&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;デフォルト&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json({</span><span style="color: #CE9178">&quot;query&quot;</span><span style="color: #D4D4D4">: query})</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>JSONリクエストとレスポンス</strong></h3>



<p class="wp-block-paragraph">SanicではJSONデータの送受信が簡単に行えます。</p>



<h6 class="wp-block-heading"><strong>例：JSONリクエストの処理</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@app.route(&quot;/submit&quot;, methods=[&quot;POST&quot;])
async def handle_submit(request):
    data = request.json
    return json({&quot;received&quot;: data})" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/submit&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">methods</span><span style="color: #D4D4D4">=[</span><span style="color: #CE9178">&quot;POST&quot;</span><span style="color: #D4D4D4">])</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handle_submit</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    data = request.json</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json({</span><span style="color: #CE9178">&quot;received&quot;</span><span style="color: #D4D4D4">: data})</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>WebSocketサポート</strong></h3>



<p class="wp-block-paragraph">リアルタイム通信を実現するWebSocketの実装も簡単です。</p>



<h6 class="wp-block-heading"><strong>例：WebSocketサーバー</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@app.websocket(&quot;/ws&quot;)
async def websocket_handler(request, ws):
    while True:
        message = await ws.recv()
        await ws.send(f&quot;受信: {message}&quot;)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">@app.websocket</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/ws&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">websocket_handler</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">ws</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">True</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        message = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> ws.recv()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> ws.send(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;受信: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">message</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>ミドルウェア</strong></h3>



<p class="wp-block-paragraph">Sanicではミドルウェアを使ってリクエストやレスポンスを加工できます。</p>



<h6 class="wp-block-heading"><strong>例：リクエストロギングミドルウェア</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@app.middleware(&quot;request&quot;)
async def log_request(request):
    print(f&quot;リクエスト受信: {request.method} {request.path}&quot;)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">@app.middleware</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;request&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">log_request</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;リクエスト受信: </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">request.method</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">request.path</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>Sanicの応用例</strong></h2>



<h3 class="wp-block-heading"><strong>RESTful APIの構築</strong></h3>



<p class="wp-block-paragraph">SanicはRESTful APIを簡単に構築できます。<br>以下は、CRUD操作を実装した例です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="users = {}

@app.route(&quot;/users&quot;, methods=[&quot;POST&quot;])
async def create_user(request):
    user_id = len(users) + 1
    users[user_id] = request.json
    return json({&quot;id&quot;: user_id})

@app.route(&quot;/users/&lt;user_id:int&gt;&quot;, methods=[&quot;GET&quot;])
async def get_user(request, user_id):
    user = users.get(user_id)
    if not user:
        return json({&quot;error&quot;: &quot;User not found&quot;}, status=404)
    return json(user)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">users = {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/users&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">methods</span><span style="color: #D4D4D4">=[</span><span style="color: #CE9178">&quot;POST&quot;</span><span style="color: #D4D4D4">])</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">create_user</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    user_id = </span><span style="color: #DCDCAA">len</span><span style="color: #D4D4D4">(users) + </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">    users[user_id] = request.json</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json({</span><span style="color: #CE9178">&quot;id&quot;</span><span style="color: #D4D4D4">: user_id})</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/users/&lt;user_id:int&gt;&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">methods</span><span style="color: #D4D4D4">=[</span><span style="color: #CE9178">&quot;GET&quot;</span><span style="color: #D4D4D4">])</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_user</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">user_id</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    user = users.get(user_id)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">not</span><span style="color: #D4D4D4"> user:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json({</span><span style="color: #CE9178">&quot;error&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;User not found&quot;</span><span style="color: #D4D4D4">}, </span><span style="color: #9CDCFE">status</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">404</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> json(user)</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>ストリーミング</strong></h3>



<p class="wp-block-paragraph">ストリーミングデータをリアルタイムに送信できます。</p>



<h6 class="wp-block-heading"><strong>例：ストリーミングレスポンス</strong></h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="from sanic.response import stream

@app.route(&quot;/stream&quot;)
async def stream_response(request):
    async def data_stream(response):
        for i in range(5):
            await response.write(f&quot;データ{i}\n&quot;)
            await asyncio.sleep(1)
    return stream(data_stream)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> sanic.response </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> stream</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/stream&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">stream_response</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">request</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">data_stream</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">response</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> i </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">range</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> response.write(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;データ</span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">i</span><span style="color: #569CD6">}</span><span style="color: #D7BA7D">\n</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> asyncio.sleep(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> stream(data_stream)</span></span></code></pre></div>



<h2 class="wp-block-heading"><strong>Sanicを使う際の注意点</strong></h2>



<ol class="wp-block-list">
<li><strong>非同期設計の理解</strong><br>非同期I/Oの基本を理解し、async/awaitを適切に使いましょう。</li>



<li><strong>スケールアップ戦略</strong><br>高負荷アプリケーションでは、複数のワーカーを使用する設定を検討しましょう。</li>



<li><strong>エラーハンドリング</strong><br>適切なエラーハンドリングを実装して、アプリケーションの信頼性を高めましょう。</li>
</ol>



<h2 class="wp-block-heading"><strong>まとめ</strong></h2>



<p class="wp-block-paragraph">Sanicは、高速でスケーラブルなPythonの非同期Webフレームワークであり、シンプルな設計で初心者にも扱いやすいです。この記事で紹介した基本構造や実践例を参考に、Sanicを活用して高性能なWebアプリケーションを構築してみてください！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/python-sanic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
