Hatena::ブログ(Diary)

万年素人からGeekへの道 このページをアンテナに追加 RSSフィード Twitter

2014/8/19に移行した→ 万年素人からHackerへの道
 | 

2012-03-11 Sunday

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()

URLhttp://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」がない・・まぁオプションなので省略可能だが。

→サンプルはこのサイトを見ることにした

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

wsgiウィスキー)のソースコードはここにあった

URLhttp://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ゲーム作成ツール

 |