2012-04-07 33 views
0

好吧,这是我拥有的一切:Python的管理员只装饰

我玩弄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', { 

    }) 

跳过缩进错误,我似乎......无法推测出来......我读过认为这 How to make a chain of function decorators? 以为我有基本的了解吧....但没有

任何帮助点我在正确的道路......

我缝得到了很多的错误是 类型错误:“NoneType”对象不是可调用

回答

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 

注意内部功能,这将被用来作为装饰物的包装,调用装饰对象并返回其结果,允许它用作客户端代码中装饰对象的直接替代品。如果你的包装函数没有这样做,你的装饰器就会坏掉。作为进一步的说明,我看到你正在使用这个类作为类装饰器,这意味着它将在类实例化时被调用。使用返回函数的类装饰器会使该类的子类变得困难,因为实际的类不再具有公共名称。那么,装饰一些或所有类的方法而不是类本身可能更有意义。

+0

感谢您的快速响应......我几乎在寻找你发布的内容....我想我有问题缠绕在装饰者的包装部分......在看到这个回来后,看着它并检查functools ....(新的python,工作建设为生)大声笑和装饰一些方法,而不是类可能是一个好主意,目前只是使用它来提供用户区。所以现在装饰课堂是可以的......但很高兴知道未来。谢谢 – 2012-04-08 19:03:30

+0

从类装饰器返回一个函数会比命名有更大的问题 - 它将用函数替换装饰类! – 2012-04-11 05:25:27