使用tornado实现用户认证
发布日期:2021-08-26 09:44:31 浏览次数:5 分类:技术文章

本文共 2949 字,大约阅读时间需要 9 分钟。

hot3.png

关于用户的登录状态,一部分的应用程序是采用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方法,则认为是用户的登录动作。

登录页面login.html代码如下:

            Login                

这里处理实际登录的逻辑是,在cookies中存入相应的数据。

这样,我们检测用户是否登录,只需检测cookies即可,这是BaseHandler的核心逻辑,它重写了父类的get_current_user方法。

注意MainHandler的逻辑:

如果用户没有登录,那么跳转到登录页面。

如果用户登录,那么打印出欢迎的语句。

采用装饰器

 

这里的检查登录的代码,我们可以使用闭包写一个装饰器,这样可以减少代码的冗余:

login_url = "login.html"def require_login():    def temp(func):        def wrapped(self, *args, **kargs):            if not self.current_user:                self.redirect(login_url)            return        return wrapped    return temp

这样我们在MainHandler中只需要采用装饰器修饰即可:

class MainHandler(BaseHandler):    @require_login()    def get(self):        name = tornado.escape.xhtml_escape(self.current_user)        self.write("Hello, " + name)

 

采用框架提供的装饰器

 

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这个装饰器的功能与我们编写的require_login功能相似。

另外,在自己编写的装饰器中,我们将login_url单独做成了变量,保证可配置性,所以这里我们也需要配置login_url选项。

转载于:https://my.oschina.net/inevermore/blog/388695

转载地址:https://blog.csdn.net/weixin_33881753/article/details/92458461 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:CPU cache
下一篇:原理剖析(第 008 篇)CyclicBarrier工作原理分析

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月06日 12时42分52秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

php foreach 数据库,php – 使用foreach将数据库检索的数据排列在HTML表中 2019-04-21
拉格朗日matlab编程例题,Matlab习题讲解.doc 2019-04-21
case是不是php语言关键字,PHP语言 switch 的一个注意点 2019-04-21
linux php mkdir失败,linux – mkdir错误:参数无效 2019-04-21
config.php渗透,phpMyAdmin 渗透利用总结 2019-04-21
java list 合并 重复的数据_Java ArrayList合并并删除重复数据3种方法 2019-04-21
android volley 上传图片 和参数,android - 使用android中的volley将图像上传到multipart中的服务器 - 堆栈内存溢出... 2019-04-21
android开发的取消清空按钮,Android开发实现带清空按钮的EditText示例 2019-04-21
android gp服务,ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用) 2019-04-21
mysql整体会滚_滚mysql 2019-04-21
向mysql数据库中添加批量数据类型_使用JDBC在MySQL数据库中快速批量插入数据 2019-04-21
最全的mysql 5.7.13_最全的mysql 5.7.13 安装配置方法图文教程(linux) 强烈推荐! 2019-04-21
mssql连接mysql数据库文件_在本地 怎么远程连接MSSQL数据库 2019-04-21
mssql 远程无法连接mysql_解决SQLServer远程连接失败的问题 2019-04-21
linux mysql c++编程_Linux下进行MYSQL的C++编程起步手记 2019-04-21
Maria数据库怎么复制到mysql_MySQL、MariaDB数据库的AB复制配置过程 2019-04-21
mysql5.6 icp mrr bak_【mysql】关于ICP、MRR、BKA等特性 2019-04-21
mysql utf8跟utf8mb4_MySQL utf8 和 utf8mb4 的区别 2019-04-21
docker mysql开机自启动_Docker学习4-学会如何让容器开机自启服务【坑】 2019-04-21
在mysql中删除表正确的是什么_在MySQL中删除表的操作教程 2019-04-21