tornado------用户身份验证------用户身份验证框架
一个完整的身份认证编程框架:
1 import tornado 2 from tornado import web, ioloop 3 import uuid 4 5 dict_sessions = {} 6 7 8 class BaseHandler(web.RequestHandler): # 公共基类 9 def get_current_user(self): # 写入current_user的函数 10 session_id = self.get_secure_cookie("session_id") 11 return dict_sessions.get(session_id) 12 13 14 class MainHandler(BaseHandler): 15 @web.authenticated # 需要身份认证才能访问的处理器 16 def get(self, *args, **kwargs): 17 name = tornado.escape.xhtml_escape(self.current_user) 18 self.write("Hello, " + name) 19 20 21 class LoginHandler(BaseHandler): 22 def get(self, *args, **kwargs): 23 self.write('<html><body>' 24 'Name: <input type="text" name="name">' 25 '<input type="submit" value="Sign in">' 26 '</form>' 27 '</body></html>') 28 29 def post(self, *args, **kwargs): 30 if len(self.get_argument("name")) < 3: 31 self.redirect("/login") 32 session_id = str(uuid.uuid1()) 33 dict_sessions[session_id] = self.get_argument("name") 34 self.set_secure_cookie("session_id", session_id) 35 self.redirect("/") 36 37 38 application = web.Application([ 39 (r"/", MainHandler), 40 (r"/login", LoginHandler), 41 ], cookie_secret="SECRET_DONT_LEAK", login_url="/login") 42 43 44 def main(): 45 application.listen(8888) 46 ioloop.IOLoop.current().start() 47 48 49 if __name__ == '__main__': 50 main()
网页请求页面:
代码解析:
全局字典dict_sessions保存用户信息,简单起见,此处只保存了会话ID。
定义一个公共基类,它继承于tornado.web.RequestHandler,用于定义本网站的公共属性和行为。重写了get_current_user()函数,开发
者在访问RequestHandler.current_user属性时自动被Tornado调用。
MainHandler 类是一个要求用户经过身份验证才能访问的处理器实例。里面的get方法在执行时,根据 current_user 是否被赋值判断用户
的身份认证情况。已经赋值了进行正常访问逻辑,否则自动重定向到网站的登陆页面。
在tornado.web.Application 的初始化函数中通过login_url参数给出网站的网站登陆地址。该地址还被用于tornado.web.authenticated 装饰
器在发现用户尚未验证时重定向到一个url。
清澈的爱,只为中国