0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

勉強ノート:Tornado その2

Posted at

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を使った書き方もできる。
@authenticatedpython 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()モジュールが使える。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?