読者です 読者をやめる 読者になる 読者になる

1週間でWeb Frameworkを書いてみた話

Python Web

あけましておめでとうございます。

突然の本題ですが、ちょっと紆余曲折あってさくらのレンタルサーバーのライトプランで軽くWebシステムを作ることになりました。
別に仕事でもないのでPHPで書くよりは他のスクリプト言語を勉強の意味も込めて使ってみたいなと思ったので、Pythonで書く事にしました。
まあ今のところいちばんメジャーなFrameworkはDjangoらしいので、Django使ってみるかと思ったところ…


f:id:levelfour:20140112213427p:plain

_人人人人人人人人_
> SSHが使えない <
 ̄Y^Y^Y^Y^Y^Y^Y ̄

なんと…SSHが使えないサーバーとは…
ライトプランの売りは低価格なので仕方はないんですが。
ただ、これではDjangoがインストールできない。
てかだいたいのFrameworkがインストールできない疑惑。
(Flaskも1ファイルとは聞いた覚えがありますが、virtualenvとか必要だという話も聞きました。あまり確証はない)

不幸中の幸いということで、PythonCGIを吐くのはいけることがわかりました。
ということで…

Pythonで(CGIラッパの)Web Frameworkを作ろう!!

ということになったわけです。
Frameworkの名前はibisとしました。
英語で朱鷺という意味らしいです。由来の理由は特にないです。鳥が好きだったのと、語感がよかったことですかね。

現状

https://github.com/levelfour/ibislevelfour/ibis · GitHub
Githubの方で結構頑張ってREADMEを鋭意執筆中です。
Web Frameworkに必要だと僕が感じている最低限の機能は、基本的に網羅したのかなと思っています。
実装は簡易ですし、コードの綺麗さはあまり考えていませんが…
それでも極力綺麗に書こうと努力はしたつもりです(´・ω・`)

機能

1. Viewをrenderする
Web Frameworkなので言わずもがな。LayoutとElementに分けた考え方をしています(本質的には同じもの)。
2. Viewに置換変数を埋め込める
PHPでは簡単にできますが、インデントを強要するPythonではなかなか考えもの。結果的に簡易的な置換を可能にしました。
3. GET、POST、Ajaxが受け取れる
HTTPリクエストの仕組みとかわかってよかったです。
4. Model classをXMLschemaから自動生成できる
これはPropelリスペクトです。Propelのチュートリアルを参照。
5. ModelにCRUDが揃っている
まあ当然っちゃ当然です。insert、find、update、deleteみたいなところで、findには条件指定もできます。

みたいなところでしょうか。
この程度の機能で、だいたい700行弱くらいでした。ibis.pyという1ファイルです。
詳しくはGithubのREADMEにどんどん書き加えていこうと思っているところです。

課題

実は書くのが楽しくて没頭してしまったせいで、セキュリティについては考慮できてないです。
特にSQLインジェクションが気になるところ。
実はSQLインジェクションの概要はなんとなくわかっているつもりですが、具体的なハック例などを見たことがあるわけではなく理解できてないところが多いので、その勉強がてら考えてみるのもいいのかもしれません。

感想

僕はもともとブラックボックスを覗くのが好きでプログラミングをやっているところがあるので、この1週間、というかこの1年でしょうか。Webに触れる機会が多く、最終的にWeb Frameworkなどの実装も経てWebの技術に対する理解がそれなりに深まったと思います。
これまでは「低級神!!!アセンブリこそすべて!!!」とかほざく一方C/C++以外はほぼ無関心だった厨二な高校生でしたが、こういったWebの知識も現実社会では重要ですね。
ここからネットワークへの勉強にも繋げていきたいものです。