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(CSRF、XSRF)防止
===今度やる