0

好吧,这就是我所拥有的:

我正在玩 scotch 的 authengine,但不知道如何制作管理员装饰器。继承人的代码相当简单:

class Jinja2Handler(webapp2.RequestHandler):
"""
    BaseHandler for all requests all other handlers will
    extend this handler

"""
@webapp2.cached_property
def jinja2(self):
    return jinja2.get_jinja2(app=self.app)

def get_messages(self, key='_messages'):
    try:
        return self.request.session.data.pop(key)
    except KeyError:
        return None

def render_template(self, template_name, template_values={}):
    messages = self.get_messages()
    if messages:
        template_values.update({'messages': messages})
    self.response.write(self.jinja2.render_template(
        template_name, **template_values))

def render_string(self, template_string, template_values={}):
    self.response.write(self.jinja2.environment.from_string(
        template_string).render(**template_values))

def json_response(self, json):
    self.response.headers.add_header('content-type', 'application/json', charset='utf-     8')
    self.response.out.write(json)

def UserArea(fuct):

    def Usercheck():
        return Usercheck


class PageHandler(Jinja2Handler):

def root(self):
    session = self.request.session if self.request.session else None
    user = self.request.user if self.request.user else None
    profiles = None
    emails = None
    if user:
        profile_keys = [ndb.Key('UserProfile', p) for p in user.auth_ids]
        profiles = ndb.get_multi(profile_keys)
        emails = models.UserEmail.get_by_user(user.key.id())
    self.render_template('home.html', {
        'user': user,
        'session': session,
        'profiles': profiles,
        'emails': emails,
    })

@UserArea
class UserHandler(Jinja2Handler):

def get(self):
    self.render_template('index-2.html', {

    })

跳过缩进错误......我似乎无法弄清楚......我读过这个 如何制作函数装饰器链? 以为我对此有基本的了解....但没有

任何帮助指出我正确的方式......

我经常遇到的错误是 TypeError: 'NoneType' object is not callable

4

1 回答 1

0
def UserArea(fuct):

    def Usercheck():
        return Usercheck

您将它用作装饰器,但它不返回任何内容,因此它返回None. 因此,当您尝试实例化装饰类时,您正在调用None()并且显然这不起作用。此外,包装函数仅返回自身,这很少是您想要的。

很难说你真正想要装饰器做什么,但通常装饰器是这样写的:

import functools

def UserArea(func):

    @functools.wraps(func)
    def usercheck(*args, **kwargs):
        if adminuser:   # however this gets defined
           return func(*args, **kwargs)
        else:
           raise Exception("not authorized")

    return usercheck

请注意,将用作被装饰对象的包装器的内部函数调用被装饰对象并返回其结果,从而允许将其用作客户端代码中被装饰对象的直接替代品。如果你的包装函数不这样做,你的装饰器就坏了。

作为进一步说明,我看到您将其用作类装饰器,这意味着将在实例化类时调用它。使用返回函数的类装饰器将使类的子类化变得困难,因为实际的类不再具有公共名称。那么,装饰类的部分或全部方法而不是类本身可能更有意义。

于 2012-04-08T01:38:32.870 回答