2012-04-07 7 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? が、私はそれのための基本的な理解を持っていたと思ったと思いました....しかし何

正しい方法で私を指すようにすべてのヘルプ...

私はたくさん得るために縫い目エラーが TypeError例外ではありません。「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、生きているための仕事の請負)lolとonのクラスの代わりにいくつかのメソッドを装飾することは、現時点ではユーザー領域を提供するための良いアイデアかもしれません。だからクラスを飾ることは今は大丈夫ですが、未来を知ることは良いことです。ありがとう –

+0

クラスデコレータから関数を返すことは命名よりも大きな問題を抱えます - 装飾されたクラスを関数に置き換えます! –

関連する問題