はじめに
鈴木たかのりです。
前回 に引き続きPythonエンジニア養成読本 という書籍の読書会イベント についてレポートします。
第4回の読書会 は8月27日(木)にアライドアーキテクツ株式会社 の会議室で開催されました。
当日はだいたい以下のタイムテーブルで進めました。
19:00-19:15 参加者の自己紹介
19:15-21:00 「 第5章 入門Webアプリケーション開発」
21:00-22:00 ビアバッシュ(ビールとピザでの参加者懇親会)
今回も過去3回と同様に書籍の読みあわせはせず、ページ数の関係で削ったところや、出版後の追加情報を中心に解説を行いました。
写真1 Pythonエンジニア養成読本読書会04
自己紹介
いつものように最初に参加者全員で自己紹介を行いました。今回は17名の方が参加しました。
自己紹介の中では「4回参加」「 3回参加」など結構いつもみる顔の方ができたのがいいですね。逆に初参加の方も2名いて、そのうち1名は一週間前に筆者が発表したPython入門を聞いて、その直後に読書会に参加してくれたそうです。ありがたいです。
また、今回は「第5章 入門Webアプリケーション開発」が題材ですが、普段Web開発を行っていない方がほとんどで、Web開発を行っている方はPHPやJavaなどを使っているとのことでした。
第5章 入門Webアプリケーション開発
自己紹介の後に第5章の著者の関根裕紀(@checkpoint )から自己紹介がありました。
写真2 関根裕紀(@checkpoint)さん
業務ではPythonはメインではあまり使っておらず、趣味や業務の一部で使用しているとのこと。また、最近は新卒メンバー、若手メンバーの教育支援も行っているそうです。
Pythonとの関わりはPyCon JP のスタッフ、Pythonエンジニア養成読本の執筆の他に、スピーカーとしてPyCon JPなどのイベントでPython関連の発表を行っているとのこと。
また、Pythonもくもく会 というハッカソンイベントを毎月開催しているそうです。
5-1 Webアプリケーションフレームワーク入門
この節ではPythonのWebフレームワークについて解説しています。
Webアプリケーションを作成する場合は通常は自分で一から作成はせずに、Webフレームワークというものを使って作成します。フレームワークとは枠組みのことで、Webフレームワークを使うことによって、その枠組に沿ってWebアプリケーションを作ることができます。
この節では代表的なPythonのWebフレームワークについて紹介しています。
Django
Djangoは全部入りのフレームワークです。10年位の開発の歴史があり、現在も活発です。保守的で後方互換性を重要視しています。また、大規模な事例が多いとのことです。Ruby on Railsと全部入りという意味では近いかも知れないですが、設計思想は違うそうです。
Pyramid
Pyramidはマイクロフレームワークで好みのサードパーティー製のモジュールを組み合わせて使用します。
Tornado
TornadoはFacebookが開発しているフレームワークで開発が活発です。非同期で大量のデータをさばくときによく使われています。
Flask
Flaskはこの書籍で紹介しているBottleと似ていて、軽量で簡単に使用できるフレームワークです。Djangoなどは設定ファイルなど使いはじめるために覚えることが膨大ですが、FlaskやBottleは数行書くだけでとりあえず動作させることができます。
ここで参加者に対して「PythonのどんなWebフレームワークを使っているか」という質問がありました。回答としてはFlaskを使っている人やDjango、Pyramid、Tornadoを用途によって使い分けているという人がいました。DjangoにはDjango Adminというデータを管理するための画面が自動生成できる機能があります。この機能を使いたいためにDjangoを選択することもあるそうです。
スピーカーがWebアプリケーションを構築する際におすすめするのはDjangoとのことです。理由としてはドキュメントがちゃんとしていることと、検索すると色々と情報がひっかかるからとのことです。Webアプリケーションのプロトタイプを作成する場合はBottleがおすすめだそうです。
Bottle
ここで、この書籍で使用しているWebフレームワークBottle についての説明になりました。BottleはWebフレームワークとして以下の4つの機能を提供しています。また、これらの機能はだいたいのWebフレームワークで提供されています。
ルーティング:指定されたURLと処理するコードを対応付ける仕組み
テンプレートエンジン:HTMLを返却するときにテンプレートに変数などを入れる仕組み
HTTPユーティリティ:HTTPリクエストやレスポンスを扱うためのクラスや関数
サーバ:開発用のWebサーバ
また、Bottleの特徴として1つのファイルでフレームワークが実装されているため、フレームワークをどのように作るのかという勉強にも向いているとのことです。Bottleのソースコードリーディングをそのうち実施予定とのことです。
ここで、ルーティングで使用しているデコレータについて「デコレータとはどういうものなのか?」という質問がありました。
Bottleでは以下のようにroute
デコレータを使用して「/hello
にアクセスきたらhello()
メソッドを実行する」という指定を行います(これをルーティングといいます) 。
ルーティングの指定
@route ( '/hello' )
def hello ():
# テンプレートの描画
return template ( 'Hello {{string}}' , string = 'World' )
デコレータはある関数をラップする関数です。デコレータを指定することによってある関数に機能を追加したりできます。
なお、デコレータはシンタックスシュガー(糖衣構文 )であり、以下の2つのコードはどちらも同じ動作をします。Webフレームワークだと他に「このURLはログイン必須」というデコレータでログインチェックを行ったりできるものがあります。
デコレータの例
def spam (...):
...
spam = ham ( spam )
@ham
def spam (...):
...
Bottleにはテンプレートエンジンも付属しています。プログラムからHTMLを返すときには、文字列を連結する必要がありますが、テンプレートエンジンを使用することにより、HTMLテンプレートの中に値を埋め込むことができます。例えば以下のテンプレートはbasket
の内容を一つずつ取り出し、リストで出力しています。
Bottleのテンプレート
< ul >
% for item in basket :
< li >{{ item }}</ li >
% end
</ ul >
PythonのWebフレームワークのテンプレートエンジンは他にはJinja2 、Mako 、Djangoテンプレート などがあります。Bottleのテンプレートは最低限の機能に対応しています。
Bottleのテンプレートエンジンには継承機能があります。継承はヘッダー、フッターの共通化などに利用できます。
ここで「テンプレートのrebase()
について使い方がわかりにくかった」という質問がありました。include()
はテンプレートの中に他のテンプレートを読み込む機能で、rebase()
は逆にベースとなる親テンプレートの指定した個所に、子の内容が展開されるというところが違うという説明がありました。
写真3 議論の様子
他に「Webサーバはどうするのか?」という質問がありました。回答は以下のようにありました。PHPも最近はテスト用のWebサーバを内蔵しているが、Bottle付属のWebサーバもテスト用のもので、実際にWebサービスとして公開する場合には使用しません。PythonのWebフレームワークはWSGI: Web Server Gateway interface に則っているので、WSGIに対応したアプリケーションサーバーを使用します。よく使われるのはuWSGI やGunicorn です。Tornadoは付属しているアプリケーションサーバーを使用します。
5-2 データベース開発入門
この節ではWebアプリケーションとは切っても切れないデータベースについて解説しています。
PythonではPEP 249 でデータベースとのAPI仕様が定義されています。そのため、さまざまなデータベース(MySQL、PostreSQL、Oracleなど)と接続するためのアダプターが存在します。
アダプターでデータベースに接続して直接SQLを実行することも可能ですが、データベースに特化したO/Rマッパーを使用するのが一般的です。
ここではSQLAlchemy を使用しています。他にはSQLObject やDjango付属のO/Rマッパーなどがあります。
ここで「書籍ではバージョンは0.9.9だが最新は1.0.8となっているが現状はどんな感じか」という質問がありました。回答としては、出版時に1.0系がリリースされ現在は1.0.8が最新、0.9系はこれからはメンテナンスモードのためこれからは1.0系を使うべき、とありました。また、検証はしていないが、ここで出てくる例は1.0系でもそのまま使用できると思うとのことです。
SQLAlchemyはO/Rマッパーなので、Pythonのオブジェクトを扱っているようにデータベース上の値を取得したり、変更ができます。
データベースのサンプルコード
>>> from sqlalchemy . orm import sessionmaker
>>> Session = sessionmaker ( bind = engine )
>>> session = Session () # データベースアクセスするためのセッションを作成
>>> post = Post ( title = u 'title_1' , text = u 'This is first text.' ) # データ追加
>>> session . add ( post )
>>> session . commit ()
>>> query = session . query ( Post )
>>> post = query . get ( 1 ) # データを取得
>>> post . text = u "This is updated." # データを更新
>>> session . commit ()
かなり高機能なので、いろいろ使ってみながら覚えてほしいとのことです。また、私見だがSQLが好きな人にSQLAlchemyは好かれているという印象があるそうです。面白いですね。
WebフレームワークのPyramidを使う場合はSQLAlchemyを使用することが多いそうです。また、データベースのマイグレーション(テーブルに列を追加したりすること)にはAlembic を使用するのが一般的です。
SQLAlchemyはWebアプリケーションだけではなく単独でも使用できます。バッチ処理などでも使用できるので、ぜひ使ってみてください。
5-3 [サンプル]書籍管理アプリの作成
この節ではここまで説明したBottle(Webフレームワーク)とSQLAlchemy(O/Rマッパー)を組み合わせて、簡単なWebアプリケーションを作成しています。サンプルのWebアプリケーションでは書籍の登録、編集、削除と一覧表示ができるというCRUD(Create/Read/Update/Delete)ができる一般的なものです。
Pythonコードは160行程度でクラスは2つと非常にシンプルな作りです。テンプレートを含めても400行程度しかありません。コード全体はGitHubの下記のURLで公開しているので、必要な人はダウンロードして試すことが可能です。
写真4 アプリケーションが動作している様子
このコードを動作させるには、下記のコマンドでパッケージをインストールします。bottle-sqlalchemy は名前のとおりBottleでSQLAlchemyを使用するためのパッケージです。WTForms は フォーム という入力フォームを表示したり、入力された値をチェックする機能を提供するパッケージです。WebフレームワークとしてDjangoを使用する場合は、これらの機能はすべて標準で付属しているので追加でパッケージを導入する必要はありません。
パッケージのインストール
$ pip install bottle == 0.12 . 8
$ pip install sqlalchemy == 0.9 . 9
$ pip install bottle - sqlalchemy == 0.4 . 2
$ pip install WTForms == 2.0 . 2
Webアプリケーションではこのように、サンプルとしてCRUDのアプリケーションを作成することはよくあります。処理の流れとしてはどのようなWebフレームワークを使用しても同様で、例えば新規にデータを登録する場合は以下のような流れになります。
モデルを作成する(どういうデータを管理するのかを定義する)
入力フォームに入力された値を取り出す
モデルのインスタンスに、入力された値を設定する
保存したら一覧画面に遷移する
しかし、Webアプリケーションを本格的に作成する場合は、他にも考えることが増えます。例えば以下のような観点が必要となります。
セッション管理(カート機能などの実現に必要)
セキュリティ対策(XSS、CSRFなど)
Bottleではセッション管理にBeaker を使うのが一般的です。Bottleではこのように、いろんな道具を組み合わせて使えるところがいいところです。
まとめとして、BottleはWebアプリケーションのプロトタイプを作成するときには、さくっと作れるので便利であるという話がありました。例としてPlone Symposium Tokyo 2015 で解析結果を可視化するためのWebアプリケーションを、Bottleベースで半日くらいで作成したそうです。このアプリケーションはAirbnb から東京と京都の物件の情報を取得し、価格帯をグラフ表示するというものです。発表の様子は下記レポートからも参照できます。
単純に参照するだけであればBottleは向いており、Webアプリケーション作成の取っ掛かりとしてお勧めとのことです。また、冒頭にも書きましたが、1ファイルで作成されているためフレームワークを作る方法についても勉強になるそうです。
質疑応答
最後に全体を通して質疑応答をしました。
Q:フォームでのXSS 対策はどうするのか?
A:Bottleはセキュリティ対策は自前で作成するか、サードパーティーのパッケージを使用する必要がある。DjangoはXSS、CSRF等々一通りのセキュリティ対策の機能を持っている。しかし、シンプルなWebアプリケーションを作成するときにDjangoを使うのは面倒な場合もある
Q:フォームライブラリはどれ使えばよいのか?
A:DBはSQLAlchemyで決まりでよいが、フォームにどれ(ここではWTForms)を使用するかか決めるのは苦労した。ライブラリを探すときにはGitHubを見たり、GoogleやStack Overflowを検索して参考にして決めてる。また、勉強会などに参加して詳しい人に聞くこともお勧め。
Q:Bottleでサーバを起動するときのapp.py
というファイルのファイル名は決まっているのか?
A:ファイル名はどんなものでもよい。コンソールから起動するので以下のように記述する必要がある。
コンソールから起動するスクリプト
if __name__ == ` __main__ :
# ここに動作を書きます
Q:プロトタイプ作成時はapp.py
などから実行でよいが、実環境ではどのように実行するのか?
A:Bottleをプロダクションで使ったことがない。おそらくGunicornなどのWebアプリケーションサーバを使用する。
ビアバッシュ(懇親会)
写真5 ビアバッシュ!!
読書会の終了後はビールとピザによるビアバッシュ(懇親会)です。Pythonに関連したりしなかったりといった会話のあとに、ライトニングトーク大会を行いました。
トップバッターは著者の一人でもある清原弘貴(@hirokiky )さんは自身が発表者として参加するイベントの告知です。すでに終了しましたがBPStudy#96 日経電子版 開発内製化への取り組み の第二部で「価値を届けるための技術」というタイトルで発表をするという話でした。
ライトニングトーク2番目はこちらも著者の嶋田健志(@TakesxiSximada )さんによるイベントの告知です。1つはこの記事公開時にはすでに終了していますが、SoftLayer Bluemix Summit 2015 です。このイベント「NASAをHack! Bluemix+Pythonを駆使した宇宙人探し奮闘記」というタイトルで発表を行ったようです。
もう1つはPyCon JP 2015のチュートリアル で「【初心者向けPythonチュートリアル】Webスクレイピングに挑戦してみよう 」という講座を行うことが紹介されました。このチュートリアルは前半はPythonエンジニア養成読本の内容をベースに進めて、後半はWebスクレイピング(Webサイトの内容を解析してデータを抽出する)という実用的なものです。
チュートリアルは現在チケット発売中です(別途PyCon JPの参加チケットも必要です) 。下記のURLからチケット購入可能ですので、興味のある方はぜひ参加ください。
3番目は@shigeshibu44 による「WebエンジニアとWebディレクターを兼任してわかった3つのこと」です。
写真6 shigeshibu44さん
「あるある」的な話で心が多少痛くなる発表でしたが、次回どうなったかの進捗に期待したいと思います。
ラストは、加藤尊さんの「コンピュータ将棋について~機械学習を用いた局面学習への道~」です。
写真7 加藤尊さん
この発表を会社(広告代理店)でしたところ「ポカーン」とされたそうです。まぁ、そうですよね。内容としてはコンピュータ将棋ってどうやって考えているのかの入り口がわかって非常に興味深かったです。全文検索でよく使われるn-gram がここで出てくるのは、面白いアプローチだなと思いました。
まとめ
4回目の読書会も質疑応答も活発で、ビアバッシュでも面白いライトニングトークがあり楽しい時間でした。
最終回となる次回読書会は9月17日(木)に開催します。内容は「第6章 環境構築の自動化」でAnsible について取り上げます。本を読んで試して疑問がある方、もっとここが知りたい!! という所がある方など、ぜひ参加してください。参加申し込みは下記のURLからできます。
ちなみに、最終回は著者6名全員が集合する予定です。サインをまとめてゲットするチャンスです!! では、次回もよろしくお願いします。