万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    Tornado勉強 2日目 Python Mac

    ・昨日(1日目)の続き(http://d.hatena.ne.jp/shinriyo/20120310

    URL:http://www.tornadoweb.org/documentation/overview.html
    →このサイトでサンプル実行していく。

    ・Request handlers and request arguments
    →リクエストハンドラと引数について

    URLの変更
    ・hello2.py

    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("You requested the main page")
    
    class StoryHandler(tornado.web.RequestHandler):
        def get(self, story_id):
            self.write("You requested the story " + story_id)
    
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/story/([0-9]+)", StoryHandler),
    ])
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start() 
    

    hello2.pyを作って、以下を実行した。

    python hello2.py

    http://localhost:8888/story/数字でアクセスすると、
    ※ 例えば「http://localhost:8888/story/01
    StoryHandlerメソッドにアクセスされて「You requested the story 数字」が表示されるもの。
    URLに「/story/数字」なかったら今まで通りMainHandlerにアクセスされて"You requested the main page"がブラウザで表示。

    さらにテキストエリア追加
    ・hello3.py

    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write('<html><body><form action="/" method="post">'
                       '<input type="text" name="message">'
                       '<input type="submit" value="Submit">'
                       '</form></body></html>')
    
        def post(self):
            self.set_header("Content-Type", "text/plain")
            self.write("You wrote " + self.get_argument("message"))
    
    class StoryHandler(tornado.web.RequestHandler):
        def get(self, story_id):
            self.write("You requested the story " + story_id)
    
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/story/([0-9]+)", StoryHandler),
    ])
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    →URL「http://localhost:8888/」にアクセス
    テキストエリアと「submit」ボタンが表示される。
    「文字」を入力してsubmitボタンをおすと、
    「You wrote 文字」が表示される。

    さらにログインしてないときのエラー処理
    →ログインする方法がこのサイトのページに書いてないけどね。

    # 〜〜略〜〜
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write('<html><body><form action="/" method="post">'
                       '<input type="text" name="message">'
                       '<input type="submit" value="Submit">'
                       '</form></body></html>')
    
        def post(self):
            if not self.user_is_logged_in():
                raise tornado.web.HTTPError(403)
    
            self.set_header("Content-Type", "text/plain")
            self.write("You wrote " + self.get_argument("message"))
    # 〜〜略〜〜
    

    POSTしたとき(文字入れてsubmit)にエラー処理にしたが、
    「user_is_logged_in」がそもそも定義されていない・・・。

    Overriding RequestHandler methods
    →リクエストハンドラのメソッドのオーバーライド

    http://www.tornadoweb.org/documentation/wsgi.html

    ※インポート忘れずに

    import tornado.wsgi
    

    ※サンプルに変数 「settings」がない・・まぁオプションなので省略可能だが。
    →サンプルはこのサイトを見ることにした
    URL:http://www.tornadoweb.org/documentation/wsgi.html

    wsgi(ウィスキー)のソースコードはここにあった
    →URL:http://www.tornadoweb.org/documentation/_modules/tornado/wsgi.html

    Error Handling
    →エラーハンドラ
    エラー処理は3通りある。

    "set_status"と"send_error"と"tornado.web.HTTPError"

    Templates
    →テンプレート
    ・hello6.py(処理部分)

    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            items = ["Item 1", "Item 2", "Item 3"]
            self.render("template.html", title="My title", items=items)
    
    class StoryHandler(tornado.web.RequestHandler):
        def get(self, story_id):
            self.write("You requested the story " + story_id)
    
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/story/([0-9]+)", StoryHandler),
    ])
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    ・template.html(テンプレート部分)

    <html>
       <head>
          <title>{{ title }}</title>
       </head>
       <body>
         <ul>
           {% for item in items %}
             <li>{{ escape(item) }}</li>
           {% end %}
         </ul>
       </body>
     </html>

    →処理部分での「self.render」から呼ばれてる
    →HTLの実際の表示は以下のようなリストでアイテムが表示される
    ・Item 1
    ・Item 2
    ・Item 3

    Cookies and secure cookies
    CookieとセキュアなCookie

    まずは、↓が表示されるが、
    "Your cookie was not set yet!"

    Cookieが保存され↓が表示される
    "Your cookie was set!"

    User authentication
    →ユーザ認証
    ・hello8.py

    import tornado.ioloop
    import tornado.web
    
    class BaseHandler(tornado.web.RequestHandler):
        def get_current_user(self):
            return self.get_secure_cookie("user")
    
    class MainHandler(BaseHandler):
        def get(self):
            if not self.current_user:
                self.redirect("/login")
                return
            name = tornado.escape.xhtml_escape(self.current_user)
            self.write("Hello, " + name)
    
    class LoginHandler(BaseHandler):
        def get(self):
            self.write('<html><body><form action="/login" method="post">'
                       'Name: <input type="text" name="name">'
                       '<input type="submit" value="Sign in">'
                       '</form></body></html>')
    
        def post(self):
            self.set_secure_cookie("user", self.get_argument("name"))
            self.redirect("/")
    
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/login", LoginHandler),
    ], cookie_secret="61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=")
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    →これでアクセスするとログインフォームが現れ、入力するとアクセスが出来る。
    名前を入力すれば
    「Hello, 名前」が表示される。

    別の方法
    →さっきのMainHandlerメソッドやapplicationの中身を以下のようにしてもOKらしい。
    ・hello8_dash.py

    import tornado.ioloop
    import tornado.web
    
    class BaseHandler(tornado.web.RequestHandler):
        def get_current_user(self):
            return self.get_secure_cookie("user")
    
    class MainHandler(BaseHandler):
        def get(self):
            if not self.current_user:
                self.redirect("/login")
                return
            name = tornado.escape.xhtml_escape(self.current_user)
            self.write("Hello, " + name)
    
    class LoginHandler(BaseHandler):
        def get(self):
            self.write('<html><body><form action="/login" method="post">'
                       'Name: <input type="text" name="name">'
                       '<input type="submit" value="Sign in">'
                       '</form></body></html>')
    
        def post(self):
            self.set_secure_cookie("user", self.get_argument("name"))
            self.redirect("/")
    
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/login", LoginHandler),
    ], cookie_secret="61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=")
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    Cross-site request forgery protection
    クロスサイトリクエストフォージェリCross site request forgeries(CSRFXSRF)防止

    ===今度やる

    RagePixel Unity

    ファミコン風2Dゲーム作成ツール