login_urlにリダイレクトせずに普通に403を返したいという需要は絶対にあるはずなので、login_urlにリダイレクトしてくれるデコレータと403をそのまま返すデコレータを分離した。
@functools.wraps(method)
def wrapper(self, *args, **kwargs):
if not self.current_user:
- if self.request.method in ("GET", "HEAD"):
- url = self.get_login_url()
- if "?" not in url:
- if urlparse.urlsplit(url).scheme:
- # if login url is absolute, make next absolute too
- next_url = self.request.full_url()
- else:
- next_url = self.request.uri
- url += "?" + urllib.urlencode(dict(next=next_url))
- self.redirect(url)
- return
raise HTTPError(403)
return method(self, *args, **kwargs)
return wrapper
+def authenticated_to_login(method):
+ """Decorate methods with this to require that the user be logged in."""
+ @functools.wraps(method)
+ def wrapper(self, *args, **kwargs):
+ if not self.current_user:
+ url = self.get_login_url()
+ if "?" not in url:
+ if urlparse.urlsplit(url).scheme:
+ # if login url is absolute, make next absolute too
+ next_url = self.request.full_url()
+ else:
+ next_url = self.request.uri
+ url += "?" + urllib.urlencode(dict(next=next_url))
+ self.redirect(url)
+ return
+ return method(self, *args, **kwargs)
+ return wrapper
+
class UIModule(object):
"""A UI re-usable, modular unit on a page.
Commit 3e14e9b46ff0b469847575e9ff0159863dceb984 to emorins/tornado – GitHub:
https://github.com/emorins/tornado/commit/3e14e9b46ff0b469847575e9ff0159863dceb984
一応Pull Requestしておいたが、いまいち綺麗なネーミングじゃないし、他に方法があるかもしれないので取り込まれないかもしれないが、どちらにしろこの辺りもう少し柔軟性をもたせてほしいところ。便利なんだけど。