码迷,mamicode.com
首页 > 其他好文 > 详细

使用tornado实现用户认证

时间:2014-12-29 22:52:31      阅读:614      评论:0      收藏:0      [点我收藏+]

标签:

关于用户的登录状态,一部分的应用程序是采用session实现的。

HTTP是一个无状态协议,用户的每次请求都是相互独立的,HTTP本身意识不到用户是否登录。

很多web框架选择将session存放在cookies中,本节我们也是这样实现:

import tornado.ioloop
import tornado.web

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)

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.ioloop
import tornado.web

class 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实现用户认证

标签:

原文地址:http://www.cnblogs.com/inevermore/p/4192487.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!