SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
PyCon JP 2012
                Hands on session
            FlaskによるWebアプリケーションの実装と
                   プログラミングツール

                   Atsuo Ishimoto


2012/9/16          PyCon JP 2012 Hands on session   1
講師陣 - 質問はこちらまで
             @atsuoishimoto


             @jbking


             @feiz


  近くの席の人とも話し合ってみよう!
2012/9/16            PyCon JP 2012 Hands on session   2
本日のメニュー
• 一応、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
      – 「マイクロフレームワーク」
      – シンプル
      – 拡張性重視
      – jinja2

2012/9/16            PyCon JP 2012 Hands on session   5
profileによるパフォーマンス測定
•   10分
•   PythonのcProfileモジュールの使い方
•   ソースコードのトレース
•   ボトルネックの検出




2012/9/16     PyCon JP 2012 Hands on session   6
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モジュール
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
環境設定
• 無線Lan、つながってますね?
      – www.python.org の接続を確認してください
• Python2.6 or 2.7 動きますね?
      – コンソールで python の起動を確認してください

c:¥>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32
bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more
information.



2012/9/16             PyCon JP 2012 Hands on session     10
パッケージ管理ツール
              (Linux/OS-X/Cygwin)
• Flaskをインストールするためのパッケージ管
  理ツールを用意します
• easy_install がインストール済みならそのまま
  使ってください
• 無ければ
      – http://python-distribute.org/distribute_setup.py
         をダウンロード
      – $sudo python distribute_setup.py

2012/9/16              PyCon JP 2012 Hands on session      11
パッケージ管理ツール
                 (Windows)
• Flaskをインストールするためのパッケージ管
  理ツールを用意します
• easy_install がインストール済みならそのまま
  使ってください
• 無ければ
      – http://python-distribute.org/distribute_setup.py
         をダウンロード
      – C:¥Python27¥python.exe distribute_setup.py


2012/9/16              PyCon JP 2012 Hands on session      12
Flaskのインストール
• Windowsの場合
      – C:¥Python27¥Scripts¥easy_install.exe flask


• Unix系(Linux/OS-X/Cygwin)の場合
      – sudo easy_install flask


• 動作確認
      – python –c "import flask" でエラーが出なければOK



2012/9/16            PyCon JP 2012 Hands on session   13
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.css


2012/9/16           PyCon JP 2012 Hands on session                           14
FlaskによるWebアプリケーション
2. ソースファイルを編集
https://github.com/atsuoishimoto/pyconjp_2012
を参照してください。まじめに写経しても、コピペでもかまいません。


            文字コードはUTF-8で!
Zipファイル
https://github.com/atsuoishimoto/pyconjp_2012/zipball/master



2012/9/16               PyCon JP 2012 Hands on session         15
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
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
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/>
<a
href="{{ url_for('message_form') }} ">戻る</a>




2012/9/16                   PyCon JP 2012 Hands on session      18
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
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
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
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
FlaskによるWebアプリケーション
7. 自由演習
時間があったらどうぞ

a.各ページに、現在時刻を表示してみよう
b.メッセージの長さチェック処理を入れてみよう
c.メッセージをデータベースに格納してみよう




2012/9/16    PyCon JP 2012 Hands on session   23
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
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
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
ローカル変数を参照するコードをプロファイル
     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
cProfileモジュール
実行結果
4569 function calls (4272 primitive calls) in 0.005 seconds

Ordered by: cumulative time

ncalls        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
loggingモジュール
• 実行ログを出力するフレームワーク
                                                       LoggerオブジェクトはHandler で
               ルート logger                              イベントをテキスト化して出力する


   Spam Logger         Egg Logger
                                                             ハンドラ

    Spam.Ham
                   Loggerオブジェクトは階層構造を
      Logger       持ち、イベントを上位のLoggerに
                   通知する                                                  Window
                                                              ファイル
                                                                        イベントログ

        イベント                                                   Syslog


2012/9/16                   PyCon JP 2012 Hands on session                  29
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
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
pdbモジュール
• (Pdb)というプロンプトが表示されたらコマンド
  入力可能
c:¥cygwin¥home¥ishimoto¥src¥handson¥handson.py(26)messag
e_form()
-> return render_template('message_form.html')
(Pdb)




2012/9/16            PyCon JP 2012 Hands on session   32
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) c




2012/9/16             PyCon JP 2012 Hands on session                       33
Q/A
• 質問があったらどうぞ




2012/9/16   PyCon JP 2012 Hands on session   34
お疲れ様でした!




2012/9/16     PyCon JP 2012 Hands on session   35

Más contenido relacionado

La actualidad más candente

「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of PythonTakanori Suzuki
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12Takanori Suzuki
 
QtでHello, World!!
QtでHello, World!!QtでHello, World!!
QtでHello, World!!treby
 
オープンCAEとPython
オープンCAEとPythonオープンCAEとPython
オープンCAEとPythonTatsuyaKatayama
 
debexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはdebexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはkenhys
 
3分でサーバオペレーションコマンドを作る技術
3分でサーバオペレーションコマンドを作る技術3分でサーバオペレーションコマンドを作る技術
3分でサーバオペレーションコマンドを作る技術Kei IWASAKI
 
Python twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめPython twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめYukitaka Uchikoshi
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another ApproachDaisuke Miyakawa
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botdcubeio
 
各OSにおいて、OpenCVをpythonから使う方法
各OSにおいて、OpenCVをpythonから使う方法各OSにおいて、OpenCVをpythonから使う方法
各OSにおいて、OpenCVをpythonから使う方法Katsuhiro Morishita
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCYoshifumi Kawai
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法Yoshifumi Kawai
 
2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会虎の穴 開発室
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...Yoshifumi Kawai
 

La actualidad más candente (20)

「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
 
第1回python勉強会
第1回python勉強会第1回python勉強会
第1回python勉強会
 
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
「Python言語」はじめの一歩 / First step of Python / 2016 Jan 12
 
QtでHello, World!!
QtでHello, World!!QtでHello, World!!
QtでHello, World!!
 
Pythonでゲーム作る
Pythonでゲーム作るPythonでゲーム作る
Pythonでゲーム作る
 
オープンCAEとPython
オープンCAEとPythonオープンCAEとPython
オープンCAEとPython
 
debexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするにはdebexpo(mentors.d.n)をハックするには
debexpo(mentors.d.n)をハックするには
 
3分でサーバオペレーションコマンドを作る技術
3分でサーバオペレーションコマンドを作る技術3分でサーバオペレーションコマンドを作る技術
3分でサーバオペレーションコマンドを作る技術
 
Python twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめPython twitterとtkinterのことはじめ
Python twitterとtkinterのことはじめ
 
"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach"Continuous Publication" with Python: Another Approach
"Continuous Publication" with Python: Another Approach
 
python.jpの使い方
python.jpの使い方python.jpの使い方
python.jpの使い方
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 
Python × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack botPython × Herokuで作る 雑談slack bot
Python × Herokuで作る 雑談slack bot
 
各OSにおいて、OpenCVをpythonから使う方法
各OSにおいて、OpenCVをpythonから使う方法各OSにおいて、OpenCVをpythonから使う方法
各OSにおいて、OpenCVをpythonから使う方法
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
 
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
 
2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Python入門
Python入門Python入門
Python入門
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
 

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

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Taku Unno
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiTomohiro Kumagai
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUpKenichi Mukai
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14Takako Miyagawa
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発Akira Inoue
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築Hideharu MATSUFUJI
 
Enable Skype to favorite the messages
Enable Skype to favorite the messagesEnable Skype to favorite the messages
Enable Skype to favorite the messagesdaipanchi
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化するEWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化するKiyoshi Sawada
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」Aya Komuro
 

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

WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4Aizu.LT::Tokyo #4
Aizu.LT::Tokyo #4
 
Build 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansaiBuild 番号の自動更新スクリプトについて #cocoa_kansai
Build 番号の自動更新スクリプトについて #cocoa_kansai
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUp
 
Windows Azure PHP Tips
Windows Azure PHP Tips Windows Azure PHP Tips
Windows Azure PHP Tips
 
CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14CodeIgniter東京勉強会 2011.05.14
CodeIgniter東京勉強会 2011.05.14
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
 
Enable Skype to favorite the messages
Enable Skype to favorite the messagesEnable Skype to favorite the messages
Enable Skype to favorite the messages
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化するEWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
 
Driverについて
DriverについてDriverについて
Driverについて
 

Más de Atsuo Ishimoto

NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】
NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】
NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】Atsuo Ishimoto
 
行列演算とPythonの言語デザイン
行列演算とPythonの言語デザイン行列演算とPythonの言語デザイン
行列演算とPythonの言語デザインAtsuo Ishimoto
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Atsuo Ishimoto
 
Python3と向かい合ってみる
Python3と向かい合ってみるPython3と向かい合ってみる
Python3と向かい合ってみるAtsuo Ishimoto
 
Pythonのシグナル処理
Pythonのシグナル処理Pythonのシグナル処理
Pythonのシグナル処理Atsuo Ishimoto
 
Pythonのガベージコレクション
PythonのガベージコレクションPythonのガベージコレクション
PythonのガベージコレクションAtsuo Ishimoto
 
Slide at PyCon mini JP on 2011/1/29
Slide at PyCon mini JP on 2011/1/29Slide at PyCon mini JP on 2011/1/29
Slide at PyCon mini JP on 2011/1/29Atsuo Ishimoto
 
String representation in py3k
String representation in py3kString representation in py3k
String representation in py3kAtsuo Ishimoto
 

Más de Atsuo Ishimoto (10)

Pythonの紹介
Pythonの紹介Pythonの紹介
Pythonの紹介
 
NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】
NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】
NumPyの歴史とPythonの並行処理【PyData.tokyo One-day Conference 2018】
 
行列演算とPythonの言語デザイン
行列演算とPythonの言語デザイン行列演算とPythonの言語デザイン
行列演算とPythonの言語デザイン
 
Django pgroonga
Django pgroongaDjango pgroonga
Django pgroonga
 
Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料Python 3.6 リリースパーティー 発表資料
Python 3.6 リリースパーティー 発表資料
 
Python3と向かい合ってみる
Python3と向かい合ってみるPython3と向かい合ってみる
Python3と向かい合ってみる
 
Pythonのシグナル処理
Pythonのシグナル処理Pythonのシグナル処理
Pythonのシグナル処理
 
Pythonのガベージコレクション
PythonのガベージコレクションPythonのガベージコレクション
Pythonのガベージコレクション
 
Slide at PyCon mini JP on 2011/1/29
Slide at PyCon mini JP on 2011/1/29Slide at PyCon mini JP on 2011/1/29
Slide at PyCon mini JP on 2011/1/29
 
String representation in py3k
String representation in py3kString representation in py3k
String representation in py3k
 

Último

情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法ssuser370dd7
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)ssuser539845
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor arts yokohama
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見Shumpei Kishi
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~arts yokohama
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfMatsushita Laboratory
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdfAyachika Kitazaki
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-LoopへTetsuya Nihonmatsu
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦Sadao Tokuyama
 

Último (12)

情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
情報処理学会86回全国大会_Generic OAMをDeep Learning技術によって実現するための課題と解決方法
 
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
IFIP IP3での資格制度を対象とする国際認定(IPSJ86全国大会シンポジウム)
 
2024 01 Virtual_Counselor
2024 01 Virtual_Counselor 2024 01 Virtual_Counselor
2024 01 Virtual_Counselor
 
What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?What is the world where you can make your own semiconductors?
What is the world where you can make your own semiconductors?
 
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
持続可能なDrupal Meetupのコツ - Drupal Meetup Tokyoの知見
 
2024 03 CTEA
2024 03 CTEA2024 03 CTEA
2024 03 CTEA
 
2024 04 minnanoito
2024 04 minnanoito2024 04 minnanoito
2024 04 minnanoito
 
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
2024 02 Nihon-Tanken ~Towards a More Inclusive Japan~
 
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdfTaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
TaketoFujikawa_台本中の動作表現に基づくアニメーション原画システムの提案_SIGEC71.pdf
 
20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf20240326_IoTLT_vol109_kitazaki_v1___.pdf
20240326_IoTLT_vol109_kitazaki_v1___.pdf
 
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
「今からでも間に合う」GPTsによる 活用LT会 - 人とAIが協調するHumani-in-the-Loopへ
 
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
ARスタートアップOnePlanetの Apple Vision Proへの情熱と挑戦
 

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

  • 1. PyCon JP 2012 Hands on session FlaskによるWebアプリケーションの実装と プログラミングツール Atsuo Ishimoto 2012/9/16 PyCon JP 2012 Hands on session 1
  • 2. 講師陣 - 質問はこちらまで @atsuoishimoto @jbking @feiz 近くの席の人とも話し合ってみよう! 2012/9/16 PyCon JP 2012 Hands on session 2
  • 3. 本日のメニュー • 一応、Pythonの書き方は知ってる人を、「使い こなせる」段階に • 文法の知識の次に必要な、実践的なテクニッ クを実習 2012/9/16 PyCon JP 2012 Hands on session 3
  • 4. 環境設定 • 無線Lanつながってますか? • Python2.6 or 2.7 • Flask環境のインストール 2012/9/16 PyCon JP 2012 Hands on session 4
  • 5. FlaskによるWebアプリケーション • 30分 • 単純なWebアプリケーション • Flaskとは – @mitsuhiko /Armin Ronacher – 「マイクロフレームワーク」 – シンプル – 拡張性重視 – jinja2 2012/9/16 PyCon JP 2012 Hands on session 5
  • 6. profileによるパフォーマンス測定 • 10分 • PythonのcProfileモジュールの使い方 • ソースコードのトレース • ボトルネックの検出 2012/9/16 PyCon JP 2012 Hands on session 6
  • 8. デバッガの使い方 • 20分 • pdbモジュールの使い方 • スタック/トレースなどの実行環境の説明 2012/9/16 PyCon JP 2012 Hands on session 8
  • 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. 環境設定 • 無線Lan、つながってますね? – www.python.org の接続を確認してください • Python2.6 or 2.7 動きますね? – コンソールで python の起動を確認してください c:¥>python Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. 2012/9/16 PyCon JP 2012 Hands on session 10
  • 11. パッケージ管理ツール (Linux/OS-X/Cygwin) • Flaskをインストールするためのパッケージ管 理ツールを用意します • easy_install がインストール済みならそのまま 使ってください • 無ければ – http://python-distribute.org/distribute_setup.py をダウンロード – $sudo python distribute_setup.py 2012/9/16 PyCon JP 2012 Hands on session 11
  • 12. パッケージ管理ツール (Windows) • Flaskをインストールするためのパッケージ管 理ツールを用意します • easy_install がインストール済みならそのまま 使ってください • 無ければ – http://python-distribute.org/distribute_setup.py をダウンロード – C:¥Python27¥python.exe distribute_setup.py 2012/9/16 PyCon JP 2012 Hands on session 12
  • 13. Flaskのインストール • Windowsの場合 – C:¥Python27¥Scripts¥easy_install.exe flask • Unix系(Linux/OS-X/Cygwin)の場合 – sudo easy_install flask • 動作確認 – python –c "import flask" でエラーが出なければOK 2012/9/16 PyCon JP 2012 Hands on session 13
  • 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.css 2012/9/16 PyCon JP 2012 Hands on session 14
  • 15. FlaskによるWebアプリケーション 2. ソースファイルを編集 https://github.com/atsuoishimoto/pyconjp_2012 を参照してください。まじめに写経しても、コピペでもかまいません。 文字コードはUTF-8で! Zipファイル https://github.com/atsuoishimoto/pyconjp_2012/zipball/master 2012/9/16 PyCon JP 2012 Hands on session 15
  • 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. 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. 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/> <a href="{{ url_for('message_form') }} ">戻る</a> 2012/9/16 PyCon JP 2012 Hands on session 18
  • 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. 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. 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. 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
  • 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. 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. 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. ローカル変数を参照するコードをプロファイル 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. cProfileモジュール 実行結果 4569 function calls (4272 primitive calls) in 0.005 seconds Ordered by: cumulative time ncalls 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. loggingモジュール • 実行ログを出力するフレームワーク LoggerオブジェクトはHandler で ルート logger イベントをテキスト化して出力する Spam Logger Egg Logger ハンドラ Spam.Ham Loggerオブジェクトは階層構造を Logger 持ち、イベントを上位のLoggerに 通知する Window ファイル イベントログ イベント Syslog 2012/9/16 PyCon JP 2012 Hands on session 29
  • 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. 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. pdbモジュール • (Pdb)というプロンプトが表示されたらコマンド 入力可能 c:¥cygwin¥home¥ishimoto¥src¥handson¥handson.py(26)messag e_form() -> return render_template('message_form.html') (Pdb) 2012/9/16 PyCon JP 2012 Hands on session 32
  • 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) c 2012/9/16 PyCon JP 2012 Hands on session 33
  • 34. Q/A • 質問があったらどうぞ 2012/9/16 PyCon JP 2012 Hands on session 34
  • 35. お疲れ様でした! 2012/9/16 PyCon JP 2012 Hands on session 35