Python Tornadoを使ってページ遷移をしてみるまとめ。

最近PyLadies Tokyoの運営に参加しております(ほとんどソース書けないのでもっぱら広報活動と会計委員です)。

3月に東大工学部で女学生向けイベントがあるんですね〜
http://pyladies-tokyo.connpass.com/event/11662/

(宣伝はおいておいて)
上記リンク見ていただければわかるんですが、
このイベントではTornadoというWebフレームワークを使ったアプリ作成ワークショップをしてもらうかんじです。

私もこのフレームワークをちょっとお勉強してみよう、ということでいじいじしたメモをここに残します。
今からやるのは

  1. ページ表示
  2. 1に入力した文字列を受け取って次のページで表示
  3. html上に直接ライブラリインポートをして日付表示

この3つだけ。

*PyLadies Tokyo Meet up #4 ではもうちょっと高度なアプリ作成(の裏側)をテーマに開催しますよ!(ここをクリックしてぜひご参加下さい)

また、Tornadoを使ったでもソースはここにたくさんありますので、ぜひ活用ください。まじ神様。

というわけで行ってみましょう。

【フォルダ構成】
FileDirectory

今回の実行ファイルは「myhelloworld.py」です。
myhelloworld.pyの中身はこんな感じ。

★=======================★


import tornado.ioloop
import tornado.web

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", MainHandler),          #--------①
            (r"/send/message", SendMessageHandler)
        ]

        tornado.web.Application.__init__(self, handlers)     #-----②


class MainHandler(tornado.web.RequestHandler):
    def get(self):   #----③
        self.render("templates/index.html")


class SendMessageHandler(tornado.web.RequestHandler):
    def post(self):
        send_message = self.get_argument('text_message')     #-----④
        self.render(
            "templates/result.html",
            message=send_message
        )

def main():
    app = Application()
    app.listen(8888)

    print("接続可能だよ!")
    tornado.ioloop.IOLoop.instance().start()     #------⑤

if __name__ == "__main__":
    main()

★=======================★

①ページごとの動きを、Handlerと呼ぶようです。各Handlerクラスと実際に呼び出すURLの対応付けをここで行います。
(r"[URL]", [Handlerの名前])
ですよ!

②initします。この記述がすべてのコントローラ設定完了の合図です。

③getリクエストの制御を行います。
ここでは「/(つまりルートのURL」が呼ばれたらtemplateディレクトリ配下のindex.htmlへ遷移するよう宣言しています。

④postリクエストの制御を行います。ここでは

  1. text_messageという名前のデータをhtmlからPOSTされたデータを受け取って
  2. templateディレクトリ配下のresult.html に遷移し、
  3. messageという変数へ1のデータを設定しています。

3を行うことで、遷移先ページでtext_messageのデータを利用することができるわけです。

⑤これがwebフレームワークスタートの記述。こいつが呼ばれることでリクエスト待機がはじまります。

以下がindex.html
◆=======================◆


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <title>Page Link Demo</title>
</head>
<body>
  
     -------①       {% module xsrf_form_html() %} -----------②       

文字列を次のページへ文字列を送付する簡単なページ遷移デモをします

       --------③               
</div> </body> </html>

◆=======================◆
①このformに包まれた中の値をHandlerへデータ送付して利用することができます。
今回の記述は「/send/message」のURLに紐付いたHandlerクラスのdef post を呼び出してください、の意

②Tornadoフレームワークへデータ送付するためのモジュール呼び出し記述。この子がいないと正しくHandlerへデータが送れません

③送付したいデータのnameとHandlerの中の受け取り名(self.get_argument("text_message"))を揃えないと受け取れません。

最後に遷移先ページのresult.html
●=======================●


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <title>Page Link Demo</title>
</head>
<body>
  
    

入力した文字列は

    

{{ message }}

 ------①     

です!

  
  {% from datetime import datetime %} ------②   
    {{ datetime.now() }} ---------③   
</div> </body> </html>

●=======================●

①Tornado で処理した(受け渡した)データは{{ 渡した変数名 }} と記述することで利用できます。

②{% import文 %} と書くことで、しれっとPythonコードをしのばせることができます。

③②の表示はやっぱり{{ 使いたい処理 }}

とこんな感じです。
では実際に動かしてみましょう!

60_large

61_large

62_large

以上でした!

広告

1件のコメント 追加

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中