一个完整的身份认证编程框架:

 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()

网页请求页面:

  tornado------用户身份验证------用户身份验证框架_python

 

代码解析:

  全局字典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。

 

清澈的爱,只为中国