小半个晚上只干了一件事,研究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),大致了解了怎么回事:
- 首先authenticated是不带参数的(method)这个参数除外
- 其次所有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
相关推荐
Tornado是一款开源的Python Web框架和异步网络库,它由Facebook的FriendFeed团队开发,并在2009年开源。Tornado以其高并发、低延迟的特性在Web开发领域中受到广泛的关注,尤其适用于实时Web服务,如聊天、推送通知、...
3. Web框架:Tornado.web模块提供了RequestHandler和Application等基础构建块,用于构建Web应用。 4. 模板系统:tornado.template模块提供了灵活的模板输出功能。 5. 网络工具:tornado.ioloop、tornado.iostream、*...
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...
6. **可扩展性**:尽管Web.py自身功能有限,但它可以轻松地与其他Python库集成,如CherryPy、Tornado或Gunicorn作为WSGI服务器,或者使用第三方模板引擎,如Mako或Jinja2。 现在,让我们进一步了解如何使用Web.py...
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-master"很可能按照标准的Python项目结构组织,包括`main.py`或`app.py`作为入口文件,`settings.py`存储配置,`models.py`定义数据模型,`views.py`处理视图逻辑,以及`static`和`templates`目录分别...
在Python的Web开发框架...同时,结合`@tornado.web.authenticated`装饰器,可以进一步控制哪些路由需要用户登录后才能访问。为了增强安全性,还需要配合其他措施,如防止XSS和CSRF攻击,以及定期更换`cookie_secret`。
在Tornado中,路由是通过`tornado.web.URLSpec`定义的,它将URL模式映射到特定的处理器类(Handler)实例。通过这种方式,当用户发起一个HTTP请求时,Tornado会根据URL来查找并执行相应的处理器方法。例如,我们...
class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": application....
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 ...
class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") if __name__ == "__main__": application = tornado.web.Application([ (r"/", MainHandler), ]) application....
在第一个版本中,我们创建了一个名为`RouterConfig`的类,它在初始化时会实例化一个`tornado.web.Application`对象。这个`Application`对象是Tornado中负责管理路由和处理器的核心组件。我们定义了一个装饰器`@app....
设置您无需更改任何内容即可使用您自己的 Django 项目运行它,但是run_tornado.py这一行: os . environ [ 'DJANGO_SETTINGS_MODULE' ] = 'demosite.settings' # TODO: edit this DJANGO_SETTINGS_MODULE应该指向 ...
在IT行业中,Python是一种广泛应用的编程语言,尤其在科学计算、数据分析、Web开发等领域。而PyPI(Python Package Index)是Python社区的官方仓库,它提供了海量的第三方库,使得开发者能够轻松地分享和安装Python...
作为Web框架,是一个轻量级的Web框架,类似于另一个Python web框架Web.py,其拥有异步非阻塞IO 的处理方式。 作为Web服务器,Tornado 有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它 Python ...
2. **处理器类**(如`handlers.py`):这些是处理特定URL请求的类,继承自`tornado.web.RequestHandler`。每个类通常有一个`get`或`post`方法来处理HTTP请求。 3. **模板文件**(如`templates/index.html`):...
然后编写一个配置文件(如`/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=...
class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": application....
4. URL路由和请求处理:Tornado使用`tornado.web`模块定义URL路由和请求处理函数,通过类定义的方式组织代码,易于理解和维护。 5. 自带HTTP服务器:Tornado内置了HTTP服务器,可以快速搭建Web服务,同时也支持反向...
from tornado.web import Application, RequestHandler class MainHandler(RequestHandler): def get(self): self.write("Hello, world!") if __name__ == "__main__": application = Application([ (r"/", ...