source
https://www.tornadoweb.org/en/stable/guide/templates.html
https://www.tornadoweb.org/en/stable/guide/security.html
Templates and UI
デフォルトでは、同じディレクトリ中のテンプレートファイルを探す。場所を指定したいときには、"template_path"を指定する。
ハンドラーごとに違う場所を探したい場合は、"RequestHandler.get_template_path"に設定する。
Templateの書き方
Tornadoで使われるテンプレートには制御文と式がある。
制御文は{% %}で指定する。例:{% if len(items) > 2 %}のように中にPythonの制御文をいれる。
式は{{ }}で指定する。例:{{ items[0] }}のようにPythonの式をいれる。
localeを指定できる。locale.name=en_US。
localeによって変更したい部分は_(" ")で指定する。
RequestHandler.get_user_localeをオーバーライドしてデフォルトのlocaleを変更できる。
UI module
TornadoはUIモジュールをサポートしている。tornado.web.UIModuleを継承したクラスを作成して、Tornadoのui_modulesに作成した.pyファイルの名前を追加することで使用できる。
settings = {"ui_modules": uimodules,} #uimodules.pyを作成した場合
作成したUIModuleはテンプレートの中で使用できる。例えば、Entryモジュールを使用したい場合、{% module %}文で呼び出せる。
{% for entry in entries %}
{% module Entry(entry) %}
{% end %}
UIモジュールの中でCSSやjavascriptを使用することもできる。それぞれembedded_css(), embedded_javascript()などのメソッドとしてUIモジュールクラスにかく。
CSSは<head>で読み込まれ、javascriptは</body>の直前で読み込まれる。
Authentication and security
Cookiesの設定
RequestHandler中のset_cookie("cookie_name", "cookie_val")でユーザのブラウザにクッキーを設定できる。偽造防止のために、set_secure_cookie, get_secure_cookieメソッドを使うこともできる。セキュア版を使う時は、cookie_secretにシークレット鍵名を指定する必要がある。secure cookieにはコード化された値とタイムスタンプを含んでいて、get_secure_cookieはcookieの期限が切れているとNone(cookieが設定されていない場合と同じ)を返す。デフォルトの期限は30日。
ユーザー認証
self.current_user()をハンドラが呼び出されるごとに実行してユーザー認証を行う。デフォルトでcurrent_userの値はNone。cookieにuser名を保存しておいて、それを認証に使う場合、get_current_user()でuser cookieの値を返すようにオーバーライドする。
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) #current_userが有効なら、Helloメッセージを出す。
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="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__")
decolatorを使った書き方もできる。
@authenticatedはpython if not self.current_user: self.redirect()
と同じ作用。
サードパーティ認証
tornado.authモジュールを使うと、Google, Facebookなどと連携した認証・認可を行える。
CSRF protection
applicationにxsrf_cookiesを設定する。
python settings={"xsrf_cookies": True}
tornadoのアプリが_xsrfクッキーをセットする。正しい値を持たないリクエストを拒否する。POSTメソッドを使う場合、UIModuleのxsrf_form_html()モジュールが使える。