fix non standard implementation of __getattr__ #675
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
According to the the docs, a
__getattr__
magic method should either return a value for the requested attribute name, or raiseAttributeError
.A
__getattr__
method was added to theTokenUser
class that allows accessing keys on the token as if they were attributes of theTokenUser
class. In the current implementation, if the requested attribute name is not a key in thetoken
dictionary, thenNone
is returned instead of raisingAttributeError
.When Django's auth backend
ModelBackend
does permission checks on a user object, it first checks for an attribute named_perm_cache
withhasattr
, then builds the cache if it doesn't exist. Sincehasattr
incorrectly returnsTrue
for aTokenUser
instance, the cache (which would have resolved to an empty set) is never created. This ultimately results in aTypeError
becauseNone
is not Iterable.