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'オブジェクトは呼び出せません

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 に答える