C#

予想外だったのでメモ

質問:
asp.netで公式が用意しているwebフレームワーク以外のフレームワークがnugetなどにあったりしますか?
rubyのSinatraみたいな薄いフレームワークってある

はい、そのような考え方はとても良い視点です。ASP.NETのような重厚なフレームワークに比べて、RubyのSinatraのような「薄い」Webフレームワークを.NET(C#)で探すことは、ミニマルで高速なWebアプリ開発を求める場合に有効です。

✔ ASP.NET以外の「軽量」Webフレームワーク

  1. Carter

URL: https://github.com/CarterCommunity/Carter

概要: ASP.NET Coreの上に構築された軽量マイクロフレームワーク。Sinatra風に書けます。

特徴:

モジュールベースでルーティング

ASP.NET CoreのミドルウェアやDIと互換性あり

非常にシンプルな構文

  1. NancyFx(非アクティブだが参考になる)

URL: https://github.com/NancyFx/Nancy

概要: Sinatraインスパイアの軽量フレームワーク。今は開発終了していますが、学習や小規模用途には依然として使えます。

  1. Minimal API (ASP.NET Core 6以降の機能)

公式ですが「薄い」アプローチ

.NET 6以降では Minimal API が公式サポートされており、Sinatra風の非常にシンプルな書き方が可能です

公式ではありますが、フルMVCやRazorなどと比べて極めて軽量です。

  1. EmbedIO

URL: https://github.com/unosquare/embedio

概要: Windows環境や軽量サーバ用途に向いた、自己ホスト型のWebフレームワーク。

特徴: .NETでIoTや小規模Web API用途に適しています。

  1. SimpleHttpServer / Watson Webserver

さらに低レベルのHTTPフレームワーク。WebAPIを提供するだけの超軽量用途向け。

~~公式で薄いフレームワーク出していたんですね ~~
→冷静に考えたら、初期状態で作っているだけね

チュートリアルはここらへん
https://learn.microsoft.com/ja-jp/aspnet/core/tutorials/min-web-api?view=aspnetcore-9.0&tabs=visual-studio

投稿日時: 2025-06-02 12:18:02
更新日時: 2025-06-12 14:23:12

ルーティング

関数の前に @app.route(ルート) を設定する

@app.route("/")
def index():
    return "Test"

@app.route("/hoge")
def index():
    return "foobar"

methodsを省略するとGETとなります

methodの指定

GET以外を指定するのであればmethodsに配列で指定

@app.route("/", methods=["GET", "POST"])
def sample():
    return "hogehoge"

Flask 2.0以降では、以下のようにもかける

@app.get("/")
@app.post("/")
def sample():
    return "hogehoge"

これは、厳密には、以下のようにapp.routeを2回実行しているのと同等らしい

@app.route("/", methods=["GET"])
@app.route("/", methods=["POST"])
def sample():
    return "hogehoge"

尚、methodで処理を振り分けるには、from flask import requestを追加し、
request.method で判定する

任意のルートを受けるようにする

ルーティングに変数を設定し、任意のルートをうける

@app.route("/animal/<name>")
def sample(name):
    if(name == "cat"):
        return "ニャー"
    elif(name == "dog"):
        return "ワン"
    else:
        return "???"

/animal/cat ならニャーを返すといった感じになる
<>を設定したら、関数の引数に受ける必要あり

さすがになんでもうけるってのも問題だと思うので・・・

コンバーター

所定のパスをうけるよにするために指定する
blogとかで記事のidを受けたい場合は

from flask import Flask

app = Flask(__name__)

@app.route("/blog/<int:id>")
def sample(id):
    return str(id)

カスタムコンバーター

デフォルトのコンバーターだと足りないので、コンバーターをカスタムで作る
例えば正規表現に該当するパスだけ受け付ける場合

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

class RegexConverter(BaseConverter):
    def __init__(self, url_map, *items):
        super().__init__(url_map)
        self.regex = items[0]

app.url_map.converters['regex'] = RegexConverter #カスタムコンバーター追加

@app.route("/aaa/<regex('\d{4}-\d{2}-\d{2}'):date>")
def sample(date):
    return date

ルートの確認

flask routesを実行するとルートの一覧を確認できる

投稿日時: 2025-05-31 15:16:31
更新日時: 2025-06-01 10:36:01

最近の投稿

最近のコメント

タグ

アーカイブ

その他