【发布时间】:2023-03-05 05:49:01
【问题描述】:
首先我创建了一些我想在任何地方使用的用户管理功能,并将它们绑定到cherrypy,我认为我可以在其他地方导入cherrypy,它们就会在那里。当不用作装饰器时,其他函数似乎可以通过这种方式很好地导入。
from user import validuser
cherrypy.validuser = validuser
del validuser
这不起作用,所以接下来我尝试将函数从顶级页面类传递到我的cherrypy网站(/analyze)的一部分的类中:
class Root:
analyze = Analyze(cherrypy.validuser) #maps to /analyze
在分析类中,我提到了它们。这适用于普通功能,但不适用于装饰器。为什么不呢?
class Analyze:
def __init__(self, validuser):
self.validuser = validuser
@cherrypy.expose
@self.validuser(['uid'])
def index(self, **kw):
return analysis_panel.pick_data_sets(user_id=kw['uid'])
我被困住了。如何传递函数并将它们用作装饰器。我不想像这样包装我的函数:
return self.validuser(analysis_panel.pick_data_sets(user_id=kw['uid']),['uid'])
谢谢。
添加/编辑:这是装饰器正在做的事情,因为作为一个单独的问题,我认为它没有正确地将 user_id 添加到 kwargs 中
def validuser(old_function, fetch=['uid']):
def new_function(*args, **kw):
"... do stuff. decide is USER is logged in. return USER id or -1 ..."
if USER != -1 and 'uid' in fetch:
kw['uid'] = user_data['fc_uid']
return old_function(*args, **kw)
return new_function
只有传入的 kwargs 出现在 new_function 的 kwargs 中。我尝试添加的任何内容都不存在。 (我正在做的似乎在这里工作How can I pass a variable in a decorator to function's argument in a decorated function?)
【问题讨论】:
-
我还发现这个例子很有用 - 演示如何在cherrypy上创建一个对用户进行身份验证的过程。 stackoverflow.com/questions/6552025/… 请注意,我和她从(此处为github.com/cherrypy/CherryPy/issues/1311)提取的文档将步骤附加在错误的位置。这是一个“before_handler”步骤。
标签: python class cherrypy python-decorators