'Rolle' - Objekt hat kein Attribut '__name__'
Bin ich versucht zu implementieren rollenbasierter Berechtigung in meiner Anwendung. Ich habe einen Dekorateur role_required, in die ich übergeben kann, der einen Satz der Benutzer-Rollen und nur die Benutzer mit dieser Rolle können den Zugriff, die Ansicht. Ich habe die korrekte Zuordnung der Rollen zum Benutzer, aber jetzt bin ich immer AttributeError, die besagt, dass 'Role' object has no attribute '__name__'
views.py
Datei:
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)
Den Dekorator 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)
Den Role
Klasse:
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()
Ich bin nicht in der Lage, um herauszufinden, warum dieser Fehler wird ausgelöst werden. Kann mir jemand helfen. Lassen Sie mich hinzufügen, wird die traceback-mit diesem
Umgebung:
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__'
- Poste bitte die vollständigen traceback, einschließlich der Zeilennummern. Sie können nicht Debuggen das problem, bis Sie genau wissen, was code ist, was es ist. Eine exception wird nicht ausgelöst durch "a-Klasse", es wird ausgelöst durch eine einzelne Linie des Codes.
- Und wo ist
Role
Klasse? Vielleicht ist es nur ein Tippfehler? - Rolle Klasse in userrole von apps.thirdparty.userroles Rollen importieren
- Das problem scheint in der
role_required
Dekorateur, dessen code Sie nicht veröffentlichen. Bitte versuchen Sie, zur Senkung der mit deinem post enthalten den code, der relevant ist, um die Fehler und nicht ein Haufen von fremden code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf den code für
django.utils.Dekorateure.method_decorator
. Die Methode Dekorator gibt es nicht annehmen können weitere Parameter speichern, die für die eigentliche Funktion zu dekorieren. Eigenschaften dieser Funktion, einschließlich seiner__name__
kopiert werden über überfunctools.update_wrapper
in der gewohnten Python-Mode. Sie erhalten diesen Fehler, weil Sie an einemRole
- Objekt statt einer Funktion.In anderen Worten, Sie müssen schreiben Sie Ihre Ansicht wie diese:
Dies ist ein potenzielles Duplikat Warum python-Instanzen haben keine __name__ attribute?
Kurze Antwort: der name einer Klasse ist in der Klasse gespeichert und nicht direkt auf die Instanz.
Sie können auf den Namen der Klasse eine Instanz über
myinstance.__class__.__name__
.