4

アプリケーションにロール ベースのアクセス許可を実装しようとしています。ユーザーロールのセットを渡すことができるデコレータ role_required があり、そのロールを持つユーザーのみがそのビューにアクセスできます。ユーザーにロールを適切に割り当てましたが、今はそのことを示す AttributeError を取得しています'Role' object has no attribute '__name__'

views.pyファイル:

m_role_required = method_decorator(role_required)
class AddProposal(FormView):

    @m_role_required(roles.space_admin)
    def dispatch(self, *args, **kwargs):
        return super(AddProposal, self).dispatch(*args, **kwargs)

デコレータrole_required:

from django.contrib.auth.decorators import user_passes_test
def role_required(*roles):

    def check_role(user):
        return getattr(user, 'role', None) in roles
    return user_passes_test(check_role)

Roleクラス:

class Roles(object):
    _roles_dict = None

    @property
    def roles_dict(self):

        if self._roles_dict is None:
            self._roles_dict = {}
            for item in self._config:
                if isinstance(item, basestring):
                    # An item like 'manager'
                    self._roles_dict[item] = None
                else:
                    # Anything else
                    raise ImproperlyConfigured(_INCORRECT_ARGS)
        return self._roles_dict

    @property
    def choices(self):

        return [(role, role) for role in self.roles_dict.keys()]

    def __init__(self, config=None):

        self._config = config or getattr(settings, 'USER_ROLES', ())

    def __getattr__(self, name):

        if name in self.roles_dict.keys():
            return Role(name=name)
        else:
            raise AttributeError("No such role exists '%s'" % name)

roles = Roles()

このエラーが発生する理由を見つけることができません。誰でも助けることができます。これでトレースバックを追加させてください。

環境:

Request Method: GET
Request URL: http://127.0.0.1:8000/en-gb/spaces/bithin/proposal/add/


Traceback:

  48. class AddProposal(FormView):
File "/home/bithin/gsoc/week3/e-cidadania/src/apps/ecidadania/proposals/views.py" in AddProposal
  78.     @m_role_required(roles.space_admin)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _dec
  34.         update_wrapper(_wrapper, func)
File "/usr/lib/python2.7/functools.py" in update_wrapper
  33.         setattr(wrapper, attr, getattr(wrapped, attr))

Exception Type: AttributeError at /en-gb/spaces/bithin/proposal/add/
Exception Value: 'Role' object has no attribute '__name__'
4

2 に答える 2

5

のコードを見てくださいdjango.utils.decorators.method_decorator。それが返すメソッド デコレーターは、実際の関数を装飾するための保存されたパラメーターをさらに受け入れることはできません。を含むこの関数のプロパティは、通常の Python の方法で__name__を介してコピーされます。関数の代わりにオブジェクトfunctools.update_wrapperを渡すため、このエラーが発生します。Role

つまり、ビューを次のように書き直す必要があります。

space_admin_required = method_decorator(role_required(roles.space_admin))
class AddProposal(FormView):

    @space_admin_required
    def dispatch(self, *args, **kwargs):
        return super(AddProposal, self).dispatch(*args, **kwargs)
于 2012-06-22T09:00:07.880 に答える
4

これは、 Why do python instances have no __name__ attribute? の重複の可能性があります。

簡単な答え: クラスの名前はクラスに格納され、インスタンスで直接使用することはできません。経由でインスタンスのクラス名にアクセスできますmyinstance.__class__.__name__

于 2013-11-25T22:44:52.437 に答える