首页 > 代码库 > 使用tornado实现用户认证
使用tornado实现用户认证
关于用户的登录状态,一部分的应用程序是采用session实现的。
HTTP是一个无状态协议,用户的每次请求都是相互独立的,HTTP本身意识不到用户是否登录。
很多web框架选择将session存放在cookies中,本节我们也是这样实现:
import tornado.ioloopimport tornado.webclass 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)class LoginHandler(tornado.web.RequestHandler): def get(self): self.render("login.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="61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=")if __name__ == ‘__main__‘: application.listen(8888) tornado.ioloop.IOLoop.instance().start()
这里的核心便是LoginHandler类,他的get方法对于HTTP的GET请求,返回一个表单,对于post方法,则认为是用户的登录动作。
这里处理实际登录的逻辑是,在cookies中存入相应的数据。
这样,我们检测用户是否登录,只需检测cookies即可,这是BaseHandler的核心逻辑,它重写了父类的get_current_user方法。
注意MainHandler的逻辑:
如果用户没有登录,那么跳转到登录页面。
如果用户登录,那么打印出欢迎的语句。
MainHandler需要检测用户是否登录,我们可以采用装饰器@tornado.web.authenticated来帮助我们完成这一目标,而不需要手工写出检测的代码。
import tornado.ioloopimport tornado.webclass BaseHandler(tornado.web.RequestHandler): def get_current_user(self): return self.get_secure_cookie("user")class MainHandler(BaseHandler): @tornado.web.authenticated def get(self): name = tornado.escape.xhtml_escape(self.current_user) self.write("Hello, " + name)class LoginHandler(tornado.web.RequestHandler): def get(self): self.render("login.html") def post(self): self.set_secure_cookie("user", self.get_argument("name")) self.redirect("/")settings = { "cookie_secret": "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o", "login_url": "/login",}application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler) ], **settings) if __name__ == ‘__main__‘: application.listen(8888) tornado.ioloop.IOLoop.instance().start()
每当采用@tornado.web.authenticated修饰后,每次调用该方法,都会执行类似
if not self.current_user: self.redirect("/login") return
的代码段。很显然,这就是装饰器的功能。
不要忘了实现BaseHandler,重写父类的get_current_user方法。
另外,既然是自动定向,那么需要手工配置login_url参数。
使用tornado实现用户认证
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。