# バージョン21.6

# 概要

これは、バージョン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.streamsanic.response.file_stream の両方に影響し、どちらもフード内で StreamingHTTPResponse をインスタンス化します。

正確な移行経路はまだ決定されていませんが、sanic.response.streamsanic.response.file_stream は何らかの形で v21.12 に便利な演算子として存在し続けることになります。9 月のリリースまでに最終決定する予定ですので、この夏中に詳細をご確認ください。

# CompositionViewの非推奨化

CompositionView の使用は非推奨となり、21.12で削除される予定です。

# パスパラメータ型の非推奨: stringinteger

今後は、パスパラメータの型として、 stringnumber ではなく、 strfloat を使用する必要があります。

@app.get("/<foo:str>/<bar:float>")
async def handler(request, foo: str, bar: float):
    ...

既存の stringnumber 型はエイリアスとして引き続き動作しますが、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インスタンスは、より厳しい要件に適合しなければなりません。

  1. 英数字のみからなること。
  2. ハイフン(-)またはアンダースコア(_)を含むことはできる。
  3. 文字(大文字または小文字)で始まること。

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"
}

# ConfigSanic.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 の改善点

  1. 既存機能に対する新しいフラグ:--auto-reload
  2. 既存の引数に対するいくつかの新しい略記フラグ
  3. 新機能: --factory
  4. 新機能: --simple
  5. 新機能: --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.routebp.route デコレータ (そして、すべての便利なデコレータ)
  • Blueprintのインスタンス化
  • Blueprint.groupコンストラクタ
  • BlueprintGroupのインスタンス化
  • app.blueprintの登録

# シグナルイベント自動登録

config.EVENT_AUTOREGISTERTrue に設定すると、以前にシグナルハンドラが定義されていない場合でも、任意のシグナルイベントを待ち受けることができるようになります。

@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")

# 無限に再利用可能で入れ子にできる BlueprintBlueprintGroup です。

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)も検討してください。

MIT Licensed
Copyright © 2018-present Sanic Community Organization

~ Made with ❤️ and ☕️ ~