`

tornado: web.py 之 Authenticated

 
阅读更多

小半个晚上只干了一件事,研究web.py里面的authenticated方法。 

 

先看这个函数的注释: 

 

"""Decorate methods with this to require that the user be logged in."""

 

 

所以基本这个很清楚了,假设你有一个handler,而这个handler中有一个方法调用需要用户已登录,例如:

 

class TrasactionManager:
    def getTransactionDetail(self, id):
        blahblahblah

 我们需要保证只有已经登录的用户才能调用到getTransactionDetail方法,那么,使用authenticated这个装饰器,来保证这个函数被调用前tornado会做相应的检查,修改后如下:

 

 

class TrasactionManager:

    @authenticated
    def getTransactionDetail(self, id):
        blahblahblah

 

 

当然了,这是其然,其所以然本菜鸟研究了半天。。。

首先就对python中的decorator不熟,谷歌了一下,找了一篇文章(http://blog.donews.com/limodou/archive/2004/12/19/207521.aspx),大致了解了怎么回事:

  1. 首先authenticated是不带参数的(method)这个参数除外
  2. 其次所有decorator修饰的方法会被python解释器“预处理”,例如:
    def simpleDecorator(method):
         print "This is a decorator"
         return method
    
    @simpleDecorator
    def simpleMethod():
         print "This is a method been decorated"
     这个例子里,simpleMethod会被预处理为simpleMethod = simpleDecorator(simpleMethod)

所以,前面前面的例子中,类TrasactionManager中的getTransactionDetail实际上会变成这样getTransactionDetail=authenticated(getTransactionDetail),嗯原理就是这样了,不过尼嘛authenticated里面又定义了一个用装饰器修饰的方法,这就绕了。。。。最后我整理了一下,整个decorating流程大致成了这样:

@authenticated
def getTransactionDetail(self, id):
    ‘’‘logic to get the transaction detail information
    which is bundle to specific user'''
    check_transaction_detail_of_current_user_by_id

getTransactionDetail = authenticated(getTransactionDetail)
	    = (functools.wraps(getTransactionDetail))(authenticated.wrapper) 
	    = (update_wrapper(wrapper #这个wrapper是update_wrapper方法的parameter place holder,
	           getTransactionDetail,
	           assigned = WRAPPER_ASSIGNMENTS,
	           updated = WRAPPER_UPDATES))(authenticated.wrapper)
	    = update_wrapper(authenticated.wrapper,
	           getTransactionDetail,
	           assigned = WRAPPER_ASSIGNMENTS,
	           updated = WRAPPER_UPDATES)
	    = Mixin-ed authenticated.wrapper

 

老实说,看了update_wrapper代码,我觉得除了默认定义的这些个属性外(

WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')

 ),没觉得__dict__里面有啥有用的东西,嗯,大概是我修为还不够

 

所以呢,经过上面一番折腾,参考authenticated的源代码,我们可以认为,这个getTransactionDetail已经面目全非,变成了另外一个样子。。

def getTransactionDetail(self, id):
        if not self.current_user:
            if self.request.method in ("GET", "HEAD"):
                url = self.get_login_url()
                if "?" not in url:
                    if urlparse.urlsplit(url).scheme:
                        # if login url is absolute, make next absolute too
                        next_url = self.request.full_url()
                    else:
                        next_url = self.request.uri
                    url += "?" + urllib.urlencode(dict(next=next_url))
                self.redirect(url)
                return
            raise HTTPError(403)
    ‘’‘logic to get the transaction detail information
    which is bundle to specific user'''
    check_transaction_detail_of_current_user_by_id

 

 注意最后三行高亮的部分,这正是原getTransactionDetail方法的方法体,但在之前,则加入了验证用户已经登录的逻辑。

 

所以,举一反三,我们也可以设计出其他更加复杂的验证机制,例如只有site admin才能执行的函数(例如偷摸从客户账面转走1W元这样的)

 

顺便记录三篇据说是大湿的系列文章,好长。。。。留着以后看

http://blog.csdn.net/beckel/article/details/3585352

http://blog.csdn.net/beckel/article/details/3945147

http://blog.csdn.net/beckel/article/details/4072886

分享到:
评论

相关推荐

    tornado-5.0.2.tar.gz及tornado-4.1.tar.gz及tornado-1.2.1.tar.gz

    Tornado是一款开源的Python Web框架和异步网络库,它由Facebook的FriendFeed团队开发,并在2009年开源。Tornado以其高并发、低延迟的特性在Web开发领域中受到广泛的关注,尤其适用于实时Web服务,如聊天、推送通知、...

    tornado官方翻译文档

    3. Web框架:Tornado.web模块提供了RequestHandler和Application等基础构建块,用于构建Web应用。 4. 模板系统:tornado.template模块提供了灵活的模板输出功能。 5. 网络工具:tornado.ioloop、tornado.iostream、*...

    PyPI 官网下载 | tornado-1.0.tar.gz

    class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app...

    python web 轻量级框架

    6. **可扩展性**:尽管Web.py自身功能有限,但它可以轻松地与其他Python库集成,如CherryPy、Tornado或Gunicorn作为WSGI服务器,或者使用第三方模板引擎,如Mako或Jinja2。 现在,让我们进一步了解如何使用Web.py...

    Tornado教程.pdf

    class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app...

    80h_tornado:www.anger6.com网站原始码-网站

    "80h_tornado-master"很可能按照标准的Python项目结构组织,包括`main.py`或`app.py`作为入口文件,`settings.py`存储配置,`models.py`定义数据模型,`views.py`处理视图逻辑,以及`static`和`templates`目录分别...

    tornado 身份验证设置.docx

    在Python的Web开发框架...同时,结合`@tornado.web.authenticated`装饰器,可以进一步控制哪些路由需要用户登录后才能访问。为了增强安全性,还需要配合其他措施,如防止XSS和CSRF攻击,以及定期更换`cookie_secret`。

    tornado_code.rar

    在Tornado中,路由是通过`tornado.web.URLSpec`定义的,它将URL模式映射到特定的处理器类(Handler)实例。通过这种方式,当用户发起一个HTTP请求时,Tornado会根据URL来查找并执行相应的处理器方法。例如,我们...

    Tornado 是一个 Python Web 框架和异步网络库,最初在 FriendFeed 开发 .zip

    你好世界这是一个简单的 Tornado “Hello, world” 示例 Web 应用程序import asyncioimport tornadoclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")def make_app(): ...

    关于服务器——安装配置tornado

    class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": application....

    EJTAG Linux32/64和Windows版本

    EJTAG Debrick Utility v3.0 RC1 Tornado-MOD ============================================== ABOUT: This program reads/writes flash memory on the WRT54G/GS and compatible routers via EJTAG using ...

    tornado入门大全

    class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") if __name__ == "__main__": application = tornado.web.Application([ (r"/", MainHandler), ]) application....

    python用装饰器自动注册Tornado路由详解.pdf

    在第一个版本中,我们创建了一个名为`RouterConfig`的类,它在初始化时会实例化一个`tornado.web.Application`对象。这个`Application`对象是Tornado中负责管理路由和处理器的核心组件。我们定义了一个装饰器`@app....

    django-tornado:如何在 Tornado 上运行 django 的示例

    设置您无需更改任何内容即可使用您自己的 Django 项目运行它,但是run_tornado.py这一行: os . environ [ 'DJANGO_SETTINGS_MODULE' ] = 'demosite.settings' # TODO: edit this DJANGO_SETTINGS_MODULE应该指向 ...

    PyPI 官网下载 | pytest-tornado-0.4.2.tar.gz

    在IT行业中,Python是一种广泛应用的编程语言,尤其在科学计算、数据分析、Web开发等领域。而PyPI(Python Package Index)是Python社区的官方仓库,它提供了海量的第三方库,使得开发者能够轻松地分享和安装Python...

    tornado python web开发

    作为Web框架,是一个轻量级的Web框架,类似于另一个Python web框架Web.py,其拥有异步非阻塞IO 的处理方式。 作为Web服务器,Tornado 有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它 Python ...

    python测验,hello-tornado.rar

    2. **处理器类**(如`handlers.py`):这些是处理特定URL请求的类,继承自`tornado.web.RequestHandler`。每个类通常有一个`get`或`post`方法来处理HTTP请求。 3. **模板文件**(如`templates/index.html`):...

    使用Nginx_Supervisor_tornado搭建web服务参考.pdf

    然后编写一个配置文件(如`/etc/supervisor/conf.d/tornado.conf`): ```ini [program:tornado] command=/usr/bin/python /path/to/your/tornado/app.py directory=/path/to/your/app autostart=true autorestart=...

    4基于 Tornado 的 HTTP 服务器简介及代码组织框架(1).md

    class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": application....

    tornado.zip

    4. URL路由和请求处理:Tornado使用`tornado.web`模块定义URL路由和请求处理函数,通过类定义的方式组织代码,易于理解和维护。 5. 自带HTTP服务器:Tornado内置了HTTP服务器,可以快速搭建Web服务,同时也支持反向...

Global site tag (gtag.js) - Google Analytics