资讯专栏INFORMATION COLUMN

Python:Tornado 第二章:实战演练:开发Tornado网站:第八节:用户身份认证

Kahn / 3321人阅读

摘要:上一篇文章第二章实战演练开发网站第七节安全机制下一篇文章第二章实战演练开发网站第九节防止跨站攻击在的类中有一个属性用于保存当前请求的用户名。实例使用属性及方法来实现用户身份控制。该地址被用于装饰器在发现用户尚未验证时重定向到一个。

上一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第七节:安全Cookie机制
下一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第九节:防止跨站攻击

在Tornado的RequestHandler类中有一个current_user属性用于保存当前请求的用户名。RequestHandler.get_current_user的默认值是None,在get()、post()等处理函数中可以随时读取该属性以获取当前的用户名。RequestHandler.current_user是一个只读属性,所以如果想要设置该属性值,需要重载RequestHandler.get_current_user()函数以设置该属性值。

实例:使用RequestHandler.current_user属性及RequestHandler.get_current_user()方法来实现用户身份控制。

代码:

import tornado.web
import tornado.ioloop
import uuid  #UUID 生成库

dict_sessions={}  #保存所有登录的Session

class BaseHandler(tornado.web.RequestHandler):  #公共基类
    #写入current_user的函数
    def get_current_user(self):
        session_id=self.get_secure_cookie("session_id")
        return dict_sessions.get(session_id)

class MainHandler(BaseHandler):
    @tornado.web.authenticated    #需要身份认证才能访问的处理器
    def get(self):
        name=tornado.escape.xhtml_escape(self.current_user)
        self.write("Hello,"+name)

class LoginHandler(BaseHandler):
    def get(self):   #登陆页面
        self.write("<>body"
                   "
" "Name:" "" "
") def post(self): #验证是否运行登陆 if len(self.get_argument("name"))<3: self.redirect("/login") session_id=str(uuid.uuid1()) dict_sessions[session_id]=self.get_argument("name") self.set_secure_cookie("session_id",session_id) self.redirect("/") setting={ "cookie_secret":"SECRET_DONT_LEAK", #Cookie加密秘钥 "login_url":"/login" #定义登陆页面 } application=tornado.web.Application([ (r"/",MainHandler), #URL映射定义 (r"/login",LoginHandler) ],**setting) def main(): application.listen(8888) tornado.ioloop.IOLoop.current().start() #挂起监听 if __name__ == "__main__": main()

本例演示了一个完整的身份认证编程框架,整体构思如下:

用全局字典dict_sessions保存已经登录的用户信息,为了简单些,本例只保存了【回话ID:用户名】的键值对。

定义公共基类BaseHandler,该类继承自tornado.web.RequestHandler,用于定义本网站所有处理器的公共属性和行为。重载它的get_current_user()函数,其在访问RequestHandler.current_user属性时自动被Tornado调用。该函数首先用get_secure_cookie()获得本次访问的回话ID,然后利用该ID从dict_sessions中获得用户名并且返回。

MainHandler类是一个要求用户经过身份认证才能访问的处理器实例。该处理器中的处理函数get()使用了装饰器tornado.web.authenticated,具有该装饰器的处理函数在执行之前根据current_user是否已经被赋值来判断用户的身份认证情况,如果已经被赋值则可以进行正常逻辑,否则自动重定向到网站的登录页面。

LoginHandler类是登录页面处理器,其get()函数用于渲染登录页面,post()函数用于验证是否允许用户登陆。

在tornado.web.Application的初始化函数中通过login_url参数给出网站的登陆页面地址。该地址被用于tornado.web.authenticated装饰器在发现用户尚未验证时重定向到一个URL。

注意:加入身份认证的所有页面处理器需要继承自BaseHandler类,而不是直接继承原来的tornado.web.RequestHandler类。

商用的身份认证还要完善更多的内容,比如加入密码验证机制、管理登陆超时、将用户信息保存到数据库等。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42616.html

相关文章

  • PythonTornado 二章实战演练开发Tornado网站:第七节:安全Cookie机制

    摘要:上一篇文章第二章实战演练开发网站第六节异步与协程化下一篇文章第二章实战演练开发网站第八节用户身份认证是很多网站为了辨别用户的身份而存储在用户本地终端的数据,在中使用可以方便地对进行读写。 上一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第六节:异步与协程化下一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第八节:用户...

    dmlllll 评论0 收藏0
  • PythonTornado 二章实战演练开发Tornado网站:第九节:防止跨站攻击

    摘要:上一篇文章第二章实战演练开发网站第八节用户身份认证下一篇文章第三章概念及应用第一节概念跨站请求伪造,或是一种对网站的恶意利用。其中是存在漏洞的网站,而是存在攻击行为的恶意网站。 上一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第八节:用户身份认证下一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及应用:第一节:Web...

    Zoom 评论0 收藏0
  • PythonTornado 二章实战演练开发Tornado网站:第六节:异步与协程化

    摘要:上一篇文章第二章实战演练开发网站第五节输出相应函数下一篇文章第二章实战演练开发网站第七节安全机制有两种方式可改变同步的处理流程异步化针对的处理函数使用修饰器,将默认的同步机制改为异步机制。使用异步对象处理耗时操作,比如本例的。 上一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第五节:RequestHandler:输出相应函数下一篇文章:Python:...

    cod7ce 评论0 收藏0
  • PythonTornado 二章实战演练开发Tornado网站第二节:路由解析

    摘要:上一篇文章第二章实战演练开发网站第一节网站结构下一篇文章第二章实战演练开发网站第三节接入点函数向对象传递的第个参数路由映射列表的配置方式与类型,用正则字符串进行路由匹配。实例参数路径在浏览器输入页面输出其中的是正在表达式。 上一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第一节:网站结构:HelloWorld下一篇文章:Python:Tornado ...

    cppprimer 评论0 收藏0
  • PythonTornado 二章实战演练开发Tornado网站:第一节:网站结构:Hello

    摘要:上一篇文章第一章异步及协程基础第三节协程下一篇文章第二章实战演练开发网站第二节网站结构路由解析实例浏览器输入链接页面显示下面逐行解析上面的代码做了些什么首先通过语句引入包中的和类。该对象的第一个餐食用于定义程序的路由映射。 上一篇文章:Python:Tornado 第一章:异步及协程基础:第三节:协程下一篇文章:Python:Tornado 第二章:实战演练:开发Tornado网站:第...

    Taonce 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<