Day4 PythonでWebサーバー立てるなら?
気付いたかもしれませんが,ある言語(またはジャンル)毎に区切っていい感じにあげていきます.
Webサーバーって?
通常,皆さんが見ているWebページ,このページもそうですが.
サーバーというものがあり,あなたのリクエストにこたえる形でページの情報が送り返されます.
内部で色々処理をやって返す場合もあります.んで,その後者の方を今回は紹介します.
動的サーバー (APIサーバー) について
説明はこれに任せます.
まぁなんかユーザーの処理によっていろいろ変更していきます.ここ以下は動的サーバーの知識はあるとします.我々エンジニア初心者は,TODOアプリを絶対作ると思うのですが,そこでの感じの話をしていきます.
フレームワークってやつ
きっと皆さまFlaskやDjango,FastAPIやSanicなどを頭に浮かべたでしょう.
もちろんこれらもきっと便利な機能があったりドキュメントが豊富だったりするでしょう…が
今回ご紹介させていただくのは…aiohttp.web.Applicationです.
もっと低レイヤー的な考え方
(正確には低レイヤーでも何でもないが)
皆様FlaskやFastAPIそこらへんに慣れすぎです.ログイン機構とかルーティングシステムとか全て丸投げして…まったくもう…
我々エンジニアは車輪の再発明とか「自分の考えた最強の暗号化方式」をやるべきなんですよ.
もちろん,実務で使うものは一回おいておいて,自分の趣味であればいろいろ自分でやってみるべきだと思うんですよ.
from aiohttp.web import Application, RouteTableDef, run_app, Response, Request
app = Application()
routes = RouteTableDef()
@routes.get('/')
async def hello(req: Request):
return Response(text="Hello, world")
if __name__ == "__main__":
app.add_routes(routes)
web.run_app(app)
こちらがサンプルコードです.
割とよく見るフレームワークに似ていて,いいと思いませんか?
デコレータを使わない方法もあります.
from aiohttp.web import Application, get, run_app, Response, Request
app = Application()
async def hello(req: Request):
return Response(text="Hello, world")
if __name__ == "__main__":
app.add_routes([web.get('/', hello)])
run_app(app)
こっちのデコレーターを使わない方法のメリットとしては,ファイル分割が分かりやすいことですね.
DiscordBOTを開発するとき,機能がめちゃくちゃ増えてくるとCog (Extension)というものに手を出す方が多いかなと思うんですけど,それっぽいことを自前で出来るので,Cog使った開発をめちゃくちゃやっていた私としてはこっちの方がいいっていうだけです.
まぁお勧めする理由としては,ほぼ上記の理由に加えて,シンプルなシステムにしたいのに様々な機能を提供されても使わないんで邪魔やな!っていうだけです.
それではあなたも
PythonでWebサーバーを立てるなら,aiohttp.web.Applicationを使ってみてはいかがでしょうか.
どうせ非同期でHTTP操作をするならaiohttp使うんだからまぁいいでしょう.