# バージョン21.6
- 概要
- 知っておきたいこと
- StreamingHTTPResponseの非推奨化
- CompositionViewの非推奨化
- パスパラメータ型の非推奨: stringとinteger。
- バージョン0.7 ルーターアップグレード
- eof()によるインラインストリーミング
- 新しいパスパラメータタイプ: slug
- アプリケーションとブループリントの名称の厳格化、非推奨化
- Route オブジェクトへの新しいアクセス: route.uri.
- IP に影響を与えるRequestオブジェクトの新しいアクセッサ
- Config と Sanic.ctx オブジェクトの交互使用
- Sanic CLI の改善点
- バージョンプレフィックス
- シグナルイベント自動登録
- 無限に再利用可能で入れ子にできる Blueprint と BlueprintGroup です。
- HTTP メソッドを Enum として使用できるように
- HTTPMethodView の機能拡張
- ニュース
- 謝礼
# 概要
これは、バージョン21のリリースサイクルの2回目のリリースです。12月の長期サポート版でバージョン21が「確定」する前に、9月にもう1回リリースされる予定です。21.3 からは、ルーターが独自のパッケージに移動したことにお気づきかもしれません。sanic-routing
(opens new window) です。この変更は当分続きそうです。このリリースから、必要な最小バージョンは 0.7.0 になりました。
# 知っておきたいこと
詳しくは変更履歴 (opens new window)をご覧ください。注目すべき新機能・不具合、アップグレード対象など...
# StreamingHTTPResponse
の非推奨化
StreamingHTTPResponse
の使用は非推奨となり、21.12リリースで削除される予定です。これは sanic.response.stream
と sanic.response.file_stream
の両方に影響し、どちらもフード内で StreamingHTTPResponse
をインスタンス化します。
正確な移行経路はまだ決定されていませんが、sanic.response.stream
と sanic.response.file_stream
は何らかの形で v21.12 に便利な演算子として存在し続けることになります。9 月のリリースまでに最終決定する予定ですので、この夏中に詳細をご確認ください。
# CompositionView
の非推奨化
CompositionView
の使用は非推奨となり、21.12で削除される予定です。
# パスパラメータ型の非推奨: string
とinteger
。
今後は、パスパラメータの型として、 string
や number
ではなく、 str
や float
を使用する必要があります。
@app.get("/<foo:str>/<bar:float>")
async def handler(request, foo: str, bar: float):
...
既存の string
と number
型はエイリアスとして引き続き動作しますが、v21.12 で削除される予定です。
# バージョン0.7 ルーターアップグレード
これは多くのバグフィックスを含み、v0.6 よりも幅広いエッジケースをより優雅に扱えるようになりました。もし、サポートされていないパターンがあれば、報告してください (opens new window). 解決された問題のいくつかは sanic-routing
のリリースノート (opens new window) で見ることができます。
# eof()
によるインラインストリーミング
バージョン21.3には、ストリーミングの処理方法の大きな変更 (opens new window)が含まれていて、導入されたパターンがデフォルトにります(下記参照)。便利なことに、新しい response.eof()
メソッドが含まれています。これは、最終的なデータがクライアントにプッシュされた時点で呼び出されるべきものです。
@app.route("/")
async def test(request):
response = await request.respond(content_type="text/csv")
await response.send("foo,")
await response.send("bar")
await response.eof()
return response
# 新しいパスパラメータタイプ: slug
動的なパスセグメントを slug
として指定し、適切なマッチングを行うことができるようになりました。
@app.get("/articles/<article_slug:slug>")
async def article(request, article_slug: str):
...
スラッグは小文字のアルファベットか数字で構成されていなければなりません。ハイフン(-
)を含むことができますが、最初の文字にはできません。
this-is-a-slug
with-123-is-also-a-slug
111-at-start-is-a-slug
NOT-a-slug
-NOT-a-slug
# アプリケーションとブループリントの名称の厳格化、非推奨化
あなたのアプリケーションとBlueprint
インスタンスは、より厳しい要件に適合しなければなりません。
- 英数字のみからなること。
- ハイフン(
-
)またはアンダースコア(_
)を含むことはできる。 - 文字(大文字または小文字)で始まること。
Pythonの変数の命名規則と似ていますが、ハイフン(-
)を許容することが追加されています。
より緩やかな基準は廃止されました。21.12 からは、非適合は起動時のエラーになります。
# Route
オブジェクトへの新しいアクセス: route.uri
.
v21.3 の Route
オブジェクトは uri
属性を持たなくなりました。その代わりに、route.path
というクローズを取得することができました。しかし、 sanic-routing
の動作の関係で、 path
プロパティには先頭の /
がありません。これは修正され、現在は route.uri
にスラッシュが含まれるようになりました。
route.uri == f"/{route.path}"
# IP に影響を与えるRequest
オブジェクトの新しいアクセッサ
着信リクエストのIPアドレスにアクセスするために、Sanicはリクエストオブジェクトに request.ip
という便利なアクセッサを持っていました。これは新しいものではなく、開いているHTTP接続についての詳細を提供するオブジェクト request.conn_info
から来ています。
現在のバージョンでは、この conn_info
オブジェクトに新しい client_ip
アクセッサが追加されています。IPv4 の場合は、特に違いは感じないでしょう。しかし、IPv6アプリケーションでは、新しいアクセサはアドレスの "unwrapped "バージョンを提供します。次のような例を考えてみましょう。
@app.get("/")
async def handler(request):
return json(
{
"request.ip": request.ip,
"request.conn_info.client": request.conn_info.client,
"request.conn_info.client_ip": request.conn_info.client_ip,
}
)
app.run(sock=my_ipv6_sock)
$ curl http://\[::1\]:8000
{
"request.ip": "::1",
"request.conn_info.client": "[::1]",
"request.conn_info.client_ip": "::1"
}
# Config
と Sanic.ctx
オブジェクトの交互使用
独自のconfigとcontextオブジェクトをSanicアプリケーションに渡すことができるようになりました。カスタムコンフィギュレーションは sanic.config.Config
のサブクラスであるべきです。コンテキストオブジェクトは、何の制限もなく、好きなものを使用できます。
class CustomConfig(Config):
...
config = CustomConfig()
app = Sanic("custom", config=config)
assert isinstance(app.config, CustomConfig)
そして...
class CustomContext:
...
ctx = CustomContext()
app = Sanic("custom", ctx=ctx)
assert isinstance(app.ctx, CustomContext)
# Sanic CLI の改善点
- 既存機能に対する新しいフラグ:
--auto-reload
。 - 既存の引数に対するいくつかの新しい略記フラグ
- 新機能:
--factory
- 新機能:
--simple
- 新機能:
--reload-dir
.
# ファクトリーアプリケーション
ファクトリーパターン (sanic.Sanic
インスタンスを返す関数) に従ったアプリケーションでは、Sanic CLI から --factory
フラグを使用してアプリケーションを起動することができるようになりました。
from sanic import Blueprint, Sanic, text
bp = Blueprint(__file__)
@bp.get("/")
async def handler(request):
return text("😎")
def create_app() -> Sanic:
app = Sanic(__file__)
app.blueprint(bp)
return app
以下のように動かすことができます。
$ sanic path.to:create_app --factory
# Sanicシンプルサーバー
Sanic CLIには、ディレクトリをウェブサーバーとして提供するためのシンプルなパターンが含まれるようになりました。これは、ディレクトリルートにある index.html
を探します。
$ sanic ./path/to/dir --simple
WARNING
この機能はまだ初期ベータモードです。この機能は、今後変更される可能性があります。
# リロード先ディレクトリの追加
debug
または auto-reload
のいずれかを使用する場合、Sanic が新しいファイルを監視するための追加のディレクトリを含めることができます。
sanic ... --reload-dir=/path/to/foo --reload-dir=/path/to/bar
TIP
アプリケーション・ディレクトリでこれをインクルードする必要はありません。Sanic はアプリケーション内の Python ファイルが変更されると、自動的にリロードします。静的なファイルが更新されたときに、アプリケーションをリッスンして更新したい場合は、 reload-dir
引数を使用する必要があります。
# バージョンプレフィックス
version
を追加する場合、ルートには /v<YOUR_VERSION_NUM>
というプレフィックスが付きます。これは常にパスの先頭になります。これは新しいものではありません。
# /v1/my/path
app.route("/my/path", version=1)
これで、プレフィックスを変更することができます (したがって、パスのセグメントをバージョンの 前に 追加することができます)。
# /api/v1/my/path
app.route("/my/path", version=1, version_prefix="/api/v")
引数 version_prefix
は、以下のように定義することができます。
app.route
とbp.route
デコレータ (そして、すべての便利なデコレータ)Blueprint
のインスタンス化Blueprint.group
コンストラクタBlueprintGroup
のインスタンス化app.blueprint
の登録
# シグナルイベント自動登録
config.EVENT_AUTOREGISTER
を True
に設定すると、以前にシグナルハンドラが定義されていない場合でも、任意のシグナルイベントを待ち受けることができるようになります。
@app.signal("do.something.start")
async def signal_handler():
await do_something()
await app.dispatch("do.something.complete")
# somethere else in your app:
await app.event("do.something.complete")
# 無限に再利用可能で入れ子にできる Blueprint
と BlueprintGroup
です。
1つの Blueprint
を複数のグループに割り当てて再利用することはできません。また、グループ自体も他のグループと無限にネストすることができます。これにより、無限の構成が可能になります。
# HTTP メソッドを Enum
として使用できるように
Sanicにsanic.HTTPMethod
が追加されました。これは Enum
で、文字列と同じように使用することができます。
from sanic import Sanic, HTTPMethod
@app.route("/", methods=["post", "PUT", HTTPMethod.PATCH])
async def handler(...):
...
# HTTPMethodView
の機能拡張
クラスベースのビューは、3つの方法のうちの1つで取り付けられるようになりました。
オプション1 - 既存
class DummyView(HTTPMethodView):
...
app.add_route(DummyView.as_view(), "/dummy")
オプション2 - attach
メソッドから
class DummyView(HTTPMethodView):
...
DummyView.attach(app, "/")
オプション 3 - __init_subclass__
でのクラス定義から
class DummyView(HTTPMethodView, attach=app, uri="/"):
...
オプション2と3は、CBVが他のファイルにある場合に有効です。
from sanic import Sanic, HTTPMethodView
class DummyView(HTTPMethodView, attach=Sanic.get_app(), uri="/"):
...
# ニュース
# Discordとサポートフォーラム
まだコミュニティに参加していない方は、Discord server (opens new window) と Community Forums (opens new window) に参加することで一員になることができます。また、Twitterで@sanicframework (opens new window)をフォローしてください。
# SCO 2022年選挙
夏🏝 / 冬❄️(あなたのいる半球による)がやってきましたね。それは、SCOの選挙を行うことを意味します。今年は、以下のポジションがあります。
- 運営評議会メンバー(任期2年)
- ステアリング・カウンシル・メンバー(任期2年)
- ステアリング・カウンシル・メンバー(任期1年)
- リリースマネージャー v22
- リリースマネージャー v22
@vltr (opens new window)は、2年目の運営評議会を終えるために留任することになりました。
もっと詳しく知りたい方は、SCO roles and responsibilities や、Adam Hopkins の Discord を読んでみてください。
ノミネートは9月1日に開始されます。詳細は追ってフォーラムでお知らせします。
# 新しいプロジェクトが進行中
SCOの傘下に新しいプロジェクトを追加しました。sanic-ext
(opens new window) です。このプロジェクトはまだリリースされておらず、活発に開発が行われています。このプロジェクトの目標は、最終的に sanic-openapi
(opens new window) を入力検証、CORS 処理、HTTP 自動メソッドハンドラなど、ウェブアプリケーション開発者向けのより多くの機能を提供するものに置き換えることにあります。もし、お手伝いいただけるようでしたら、Discord でお知らせください。このプロジェクトの最初のリリースは、9月のリリースの前のいつか(できれば)になることを期待しています。
# 謝礼
今回のリリースに参加された皆様、ありがとうございました。 👏
@aaugustin (opens new window) @ahopkins (opens new window) @ajaygupta2790 (opens new window) @ashleysommer (opens new window) @ENT8R (opens new window) @fredlllll (opens new window) @graingert (opens new window) @harshanarayana (opens new window) @jdraymon (opens new window) @Kyle-Verhoog (opens new window) @sanjeevanahilan (opens new window) @sjsadowski (opens new window) @Tronic (opens new window) @vltr (opens new window) @ZinkLu (opens new window)
もし、このプロジェクトを楽しんでいただけるなら、ぜひ貢献をご検討ください。もちろん、コードの貢献も大好きですが、どんな形の貢献も大歓迎です。ドキュメントを書いたり、ユースケースを見せたり、会話に参加してあなたの声を伝えたり、もし可能なら金銭的貢献 (opens new window)も検討してください。
← バージョン21.9 バージョン 21.3 →