Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PyCon JP 2012                Hands on session            FlaskによるWebアプリケーションの実装と                   プログラミングツール             ...
講師陣 - 質問はこちらまで             @atsuoishimoto             @jbking             @feiz  近くの席の人とも話し合ってみよう!2012/9/16            PyC...
本日のメニュー• 一応、Pythonの書き方は知ってる人を、「使い  こなせる」段階に• 文法の知識の次に必要な、実践的なテクニッ  クを実習2012/9/16    PyCon JP 2012 Hands on session   3
環境設定• 無線Lanつながってますか?• Python2.6 or 2.7• Flask環境のインストール2012/9/16   PyCon JP 2012 Hands on session   4
FlaskによるWebアプリケーション• 30分• 単純なWebアプリケーション• Flaskとは      – @mitsuhiko /Armin Ronacher      – 「マイクロフレームワーク」      – シンプル      ...
profileによるパフォーマンス測定•   10分•   PythonのcProfileモジュールの使い方•   ソースコードのトレース•   ボトルネックの検出2012/9/16     PyCon JP 2012 Hands on ses...
loggingモジュール• 10分• Loggingモジュールの使い方2012/9/16      PyCon JP 2012 Hands on session   7
デバッガの使い方• 20分• pdbモジュールの使い方• スタック/トレースなどの実行環境の説明2012/9/16     PyCon JP 2012 Hands on session   8
タイムチャート10:00 - 10:05   アジェンダ10:05 - 10:15   環境設定10:15 - 10:45   Flaskアプリケーションの開発10:45 - 11:00   休憩11:00 - 11:10   loggingモ...
環境設定• 無線Lan、つながってますね?      – www.python.org の接続を確認してください• Python2.6 or 2.7 動きますね?      – コンソールで python の起動を確認してくださいc:¥>pyt...
パッケージ管理ツール              (Linux/OS-X/Cygwin)• Flaskをインストールするためのパッケージ管  理ツールを用意します• easy_install がインストール済みならそのまま  使ってください• 無...
パッケージ管理ツール                 (Windows)• Flaskをインストールするためのパッケージ管  理ツールを用意します• easy_install がインストール済みならそのまま  使ってください• 無ければ    ...
Flaskのインストール• Windowsの場合      – C:¥Python27¥Scripts¥easy_install.exe flask• Unix系(Linux/OS-X/Cygwin)の場合      – sudo easy_i...
FlaskによるWebアプリケーション1. プロジェクトディレクトリの作成     mkdir pyconjp_2012                                     pyconjp_2012     cd pycon...
FlaskによるWebアプリケーション2. ソースファイルを編集https://github.com/atsuoishimoto/pyconjp_2012を参照してください。まじめに写経しても、コピペでもかまいません。            文...
handson.py# -*- coding: utf-8 -*-                                                             # /add_messageでリクエストのメッセージを登...
message_form.html<!doctype html><link rel=stylesheet type=text/css href="{{ url_for(static,filename=style.css) }}"><title>...
show_messages.html<!doctype html><link rel=stylesheet type=text/css href="{{ url_for(static,filename=style.css) }}"><h1>登録...
style.css<!doctype html><link rel=stylesheet type=text/css href="{{ url_for(static,filename=style.css) }}"><title>メッセージ登録<...
FlaskによるWebアプリケーション3. 実行$python handson.pyブラウザで http://localhost:5000/ を開きます。4. 終了方法^C(Control+C)で終了します。Windowsで、終了するまで時間が...
FlaskによるWebアプリケーション5. ソースコード解説  app = Flask(__name__)     Flaskアプリケーションオブジェクトの作成  @app.route(/)           @app.route(URL)で...
FlaskによるWebアプリケーション6. jinja2テンプレート解説  <link rel=stylesheet type=text/css  href="{{ url_for(static, filename=style.css) }}"...
FlaskによるWebアプリケーション7. 自由演習時間があったらどうぞa.各ページに、現在時刻を表示してみようb.メッセージの長さチェック処理を入れてみようc.メッセージをデータベースに格納してみよう2012/9/16    PyCon JP...
cProfileモジュール            (注) Debian/Ubuntu では、            $sudo apt-get install python-profiler            が必要な場合があります• pr...
cProfileモジュール • show_messages()関数を修正します(Python2.6用)            @app.route(/show)            def show_messages():          ...
cProfileモジュール • show_messages()関数を修正します(Python2.7用)            @app.route(/show)            def show_messages():          ...
ローカル変数を参照するコードをプロファイル     def spam():       ham = 100       value = egg(ham)       return value     def spam():           ...
cProfileモジュール実行結果4569 function calls (4272 primitive calls) in 0.005 secondsOrdered by: cumulative timencalls        totti...
loggingモジュール• 実行ログを出力するフレームワーク                                                       LoggerオブジェクトはHandler で               ...
Flaskのロギングサポート • Debug用のloggerが用意されている • message_form()を関数を修正します   @app.route(/message_form)   def message_form():     ret...
pdbモジュール• Python Debugger• 変数・コールスタックの表示、ステップ実行など• とりあえずブレークしてみよう      @app.route(/message_form)      def message_form(): ...
pdbモジュール• (Pdb)というプロンプトが表示されたらコマンド  入力可能c:¥cygwin¥home¥ishimoto¥src¥handson¥handson.py(26)message_form()-> return render_t...
pdbモジュール        コマンド                  意味                                 例 l(ist)        実行中のソース行を表示する                    ...
Q/A• 質問があったらどうぞ2012/9/16   PyCon JP 2012 Hands on session   34
お疲れ様でした!2012/9/16     PyCon JP 2012 Hands on session   35
Upcoming SlideShare
Loading in …5
×

PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール

19,813 views

Published on

PyCon JP 2012 hands-on セッション / FlaskによるWebアプリケーションの実装とプログラミングツール

Published in: Technology

PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール

  1. 1. PyCon JP 2012 Hands on session FlaskによるWebアプリケーションの実装と プログラミングツール Atsuo Ishimoto2012/9/16 PyCon JP 2012 Hands on session 1
  2. 2. 講師陣 - 質問はこちらまで @atsuoishimoto @jbking @feiz 近くの席の人とも話し合ってみよう!2012/9/16 PyCon JP 2012 Hands on session 2
  3. 3. 本日のメニュー• 一応、Pythonの書き方は知ってる人を、「使い こなせる」段階に• 文法の知識の次に必要な、実践的なテクニッ クを実習2012/9/16 PyCon JP 2012 Hands on session 3
  4. 4. 環境設定• 無線Lanつながってますか?• Python2.6 or 2.7• Flask環境のインストール2012/9/16 PyCon JP 2012 Hands on session 4
  5. 5. FlaskによるWebアプリケーション• 30分• 単純なWebアプリケーション• Flaskとは – @mitsuhiko /Armin Ronacher – 「マイクロフレームワーク」 – シンプル – 拡張性重視 – jinja22012/9/16 PyCon JP 2012 Hands on session 5
  6. 6. profileによるパフォーマンス測定• 10分• PythonのcProfileモジュールの使い方• ソースコードのトレース• ボトルネックの検出2012/9/16 PyCon JP 2012 Hands on session 6
  7. 7. loggingモジュール• 10分• Loggingモジュールの使い方2012/9/16 PyCon JP 2012 Hands on session 7
  8. 8. デバッガの使い方• 20分• pdbモジュールの使い方• スタック/トレースなどの実行環境の説明2012/9/16 PyCon JP 2012 Hands on session 8
  9. 9. タイムチャート10:00 - 10:05 アジェンダ10:05 - 10:15 環境設定10:15 - 10:45 Flaskアプリケーションの開発10:45 - 11:00 休憩11:00 - 11:10 loggingモジュール11:10 - 11:20 traceによるパフォーマンス測定11:20 – 11:40 デバッガの使い方11:40 - 11:45 Q/A• 早めに課題が終わった方は、先に進んでも結 構です• 余裕があったら、周囲の人を助けてあげよう!2012/9/16 PyCon JP 2012 Hands on session 9
  10. 10. 環境設定• 無線Lan、つながってますね? – www.python.org の接続を確認してください• Python2.6 or 2.7 動きますね? – コンソールで python の起動を確認してくださいc:¥>pythonPython 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for moreinformation.2012/9/16 PyCon JP 2012 Hands on session 10
  11. 11. パッケージ管理ツール (Linux/OS-X/Cygwin)• Flaskをインストールするためのパッケージ管 理ツールを用意します• easy_install がインストール済みならそのまま 使ってください• 無ければ – http://python-distribute.org/distribute_setup.py をダウンロード – $sudo python distribute_setup.py2012/9/16 PyCon JP 2012 Hands on session 11
  12. 12. パッケージ管理ツール (Windows)• Flaskをインストールするためのパッケージ管 理ツールを用意します• easy_install がインストール済みならそのまま 使ってください• 無ければ – http://python-distribute.org/distribute_setup.py をダウンロード – C:¥Python27¥python.exe distribute_setup.py2012/9/16 PyCon JP 2012 Hands on session 12
  13. 13. Flaskのインストール• Windowsの場合 – C:¥Python27¥Scripts¥easy_install.exe flask• Unix系(Linux/OS-X/Cygwin)の場合 – sudo easy_install flask• 動作確認 – python –c "import flask" でエラーが出なければOK2012/9/16 PyCon JP 2012 Hands on session 13
  14. 14. FlaskによるWebアプリケーション1. プロジェクトディレクトリの作成 mkdir pyconjp_2012 pyconjp_2012 cd pyconjp_2012 mkdir templates handson.py mkdir static templates message_form.html show_messages.html static style.css2012/9/16 PyCon JP 2012 Hands on session 14
  15. 15. FlaskによるWebアプリケーション2. ソースファイルを編集https://github.com/atsuoishimoto/pyconjp_2012を参照してください。まじめに写経しても、コピペでもかまいません。 文字コードはUTF-8で!Zipファイルhttps://github.com/atsuoishimoto/pyconjp_2012/zipball/master2012/9/16 PyCon JP 2012 Hands on session 15
  16. 16. handson.py# -*- coding: utf-8 -*- # /add_messageでリクエストのメッセージを登録from flask import Flask, request, session @app.route(/add_message, methods=[POST])from flask import render_template, redirect, url_for def add_message(): # Sessionにメッセージを登録# Flaskのアプリケーション オブジェクトを作成 msgs = session.get(messages, [])app = Flask(__name__) msgs.append(request.form[message]) session[messages] = msgs[-10:] return redirect(url_for(show_messages))# http://localhost:5000/でアクセスされる関数@app.route(/)def index_html(): # /showでリクエストのメッセージを登録 return """ @app.route(/show)<!doctype html> def show_messages():<ul> # テンプレートファイル templates/show_messages.htmlを表示<li><a href="/message_form">メッセージ追加</a></li> return render_template(show_messages.html,<li><a href="/show">メッセージ表示</a></li></ul> messages=reversed(session[messages]))""" def main():# /message_formでアクセスされる関数 app.secret_key = "secret"@app.route(/message_form) app.run(debug = True)def message_form(): # テンプレートファイル templates/message_form.htmlを表示 if __name__ == __main__: return render_template(message_form.html) main()2012/9/16 PyCon JP 2012 Hands on session 16
  17. 17. message_form.html<!doctype html><link rel=stylesheet type=text/css href="{{ url_for(static,filename=style.css) }}"><title>メッセージ登録</title><h1>メッセージ登録</h1><form method="post" action="{{url_for(add_message)}}"><div>メッセージ : <input type="text" name="message" size=40> <button type="submit">登録</button></div></form>2012/9/16 PyCon JP 2012 Hands on session 17
  18. 18. show_messages.html<!doctype html><link rel=stylesheet type=text/css href="{{ url_for(static,filename=style.css) }}"><h1>登録済みメッセージ</h1>{% for message in messages %} <div>{{ message }}</div>{% endfor %}<hr/><ahref="{{ url_for(message_form) }} ">戻る</a>2012/9/16 PyCon JP 2012 Hands on session 18
  19. 19. style.css<!doctype html><link rel=stylesheet type=text/css href="{{ url_for(static,filename=style.css) }}"><title>メッセージ登録</title><h1>メッセージ登録</h1><form method="post" action="{{url_for(add_message)}}"><div>メッセージ : <input type="text" name="message" size=40> <button type="submit">登録</button></div></form>2012/9/16 PyCon JP 2012 Hands on session 19
  20. 20. FlaskによるWebアプリケーション3. 実行$python handson.pyブラウザで http://localhost:5000/ を開きます。4. 終了方法^C(Control+C)で終了します。Windowsで、終了するまで時間がかかる場合、Control+Breakでも終了します。2012/9/16 PyCon JP 2012 Hands on session 20
  21. 21. FlaskによるWebアプリケーション5. ソースコード解説 app = Flask(__name__) Flaskアプリケーションオブジェクトの作成 @app.route(/) @app.route(URL)で、URLへの def index_html(): return "Hello" リクエストハンドラを指定 render_template( Jinja2テンプレートを実行 テンプレートファイル, arg=vale) app.secret_key = "secret" セッションを利用するためのおまじない2012/9/16 PyCon JP 2012 Hands on session 21
  22. 22. FlaskによるWebアプリケーション6. jinja2テンプレート解説 <link rel=stylesheet type=text/css href="{{ url_for(static, filename=style.css) }}">  {{ 式 }} で式をHTMLに展開  {{ url_for(…) }} でファイルへのURLを取得 {% for message in messages %} <div>{{ message }}</div> {% endfor %} {% for x in xx %} ~ {% endfor %} で for ループ2012/9/16 PyCon JP 2012 Hands on session 22
  23. 23. FlaskによるWebアプリケーション7. 自由演習時間があったらどうぞa.各ページに、現在時刻を表示してみようb.メッセージの長さチェック処理を入れてみようc.メッセージをデータベースに格納してみよう2012/9/16 PyCon JP 2012 Hands on session 23
  24. 24. cProfileモジュール (注) Debian/Ubuntu では、 $sudo apt-get install python-profiler が必要な場合があります• profile/cProfileはPythonスクリプトの実行速度 を測定するモジュールです• 関数の呼び出し回数や処理時間を集計します• profileとcProfileの機能はほぼ同じですが、C言 語版のcProfileの方が高速です2012/9/16 PyCon JP 2012 Hands on session 24
  25. 25. cProfileモジュール • show_messages()関数を修正します(Python2.6用) @app.route(/show) def show_messages(): return render_template(show_messages.html, messages=reversed(session[messages])) @app.route(/show) def show_messages(): import cProfile localvars = locals().copy() cProfile.runctx("""ret = render_template(show_messages.html, messages=reversed(session[messages]))""", globals(), localvars) return localvars["ret"]2012/9/16 PyCon JP 2012 Hands on session 25
  26. 26. cProfileモジュール • show_messages()関数を修正します(Python2.7用) @app.route(/show) def show_messages(): return render_template(show_messages.html, messages=reversed(session[messages])) @app.route(/show) def show_messages(): import cProfile localvars = locals().copy() cProfile.runctx("""ret = render_template(show_messages.html, messages=reversed(session[messages]))""", globals(), localvars, sort=cumulative) return localvars["ret"]2012/9/16 PyCon JP 2012 Hands on session 26
  27. 27. ローカル変数を参照するコードをプロファイル def spam(): ham = 100 value = egg(ham) return value def spam(): cProfile.runctx()には、 ham = 100 localvars = locals().copy() ローカル変数辞書をコピーして渡す cProfile.runctx( “value = egg(ham)”, locals()が返す辞書(sys._getframe().f_locals)は、 globals(), localvars) インタープリタの都合で初期化されてしまう場合があるため return localvars[‘value’] 更新されたローカル変数は、コピー した辞書から値を取得する2012/9/16 PyCon JP 2012 Hands on session 27
  28. 28. cProfileモジュール実行結果4569 function calls (4272 primitive calls) in 0.005 secondsOrdered by: cumulative timencalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.005 0.005 <string>:1(<module>)…ncalls 呼び出し回数tottime 他の関数呼び出しの時間を含まない、この関数での処理時間percall 呼び出し一回あたりの関数内処理時間(tottime ÷ ncall)cumtime 他の関数呼び出しを含む、この関数の総処理時間percall 呼び出し一回あたりの総処理時間(cumtime ÷ ncall)Filename:lineno ファイル名と行番号、関数名など 2012/9/16 PyCon JP 2012 Hands on session 28
  29. 29. loggingモジュール• 実行ログを出力するフレームワーク LoggerオブジェクトはHandler で ルート logger イベントをテキスト化して出力する Spam Logger Egg Logger ハンドラ Spam.Ham Loggerオブジェクトは階層構造を Logger 持ち、イベントを上位のLoggerに 通知する Window ファイル イベントログ イベント Syslog2012/9/16 PyCon JP 2012 Hands on session 29
  30. 30. Flaskのロギングサポート • Debug用のloggerが用意されている • message_form()を関数を修正します @app.route(/message_form) def message_form(): return render_template(message_form.html)@app.route(/message_form)def message_form(): import logging app.logger.setLevel(logging.DEBUG) # 出力対象のイベントを指定 app.logger.debug(u"デバッグメッセージ") app.logger.error(u“エラーメッセージ:%s;%d“, “Spam”, 100) # 文字列変換 return render_template(message_form.html) 2012/9/16 PyCon JP 2012 Hands on session 30
  31. 31. pdbモジュール• Python Debugger• 変数・コールスタックの表示、ステップ実行など• とりあえずブレークしてみよう @app.route(/message_form) def message_form(): return render_template(message_form.html) @app.route(/message_form) def message_form(): import pdb; pdb.set_trace() return render_template(message_form.html)2012/9/16 PyCon JP 2012 Hands on session 31
  32. 32. pdbモジュール• (Pdb)というプロンプトが表示されたらコマンド 入力可能c:¥cygwin¥home¥ishimoto¥src¥handson¥handson.py(26)message_form()-> return render_template(message_form.html)(Pdb)2012/9/16 PyCon JP 2012 Hands on session 32
  33. 33. pdbモジュール コマンド 意味 例 l(ist) 実行中のソース行を表示する (Pdb) l w(here) 実行中の呼び出し履歴を表示する (Pdb) w p式 式の値を計算して表示する (Pdb) p var1 args 関数の引数を表示する (Pdb) args ! ステートメント ステートメントを実行する (Pdb) ! var1 = spam s(tep) 次の行まで実行する。次の行が関数呼び (Pdb) s 出しなら、その関数の先頭行まで実行する n(ext) 次の行まで実行する。次の行が関数呼び (Pdb) n 出しなら、その関数が終了して現在の関数 に復帰するまで実行する。 c(ontinue) Pdbプロンプトから抜けて、処理を続行する。 (Pdb) c2012/9/16 PyCon JP 2012 Hands on session 33
  34. 34. Q/A• 質問があったらどうぞ2012/9/16 PyCon JP 2012 Hands on session 34
  35. 35. お疲れ様でした!2012/9/16 PyCon JP 2012 Hands on session 35

×