запрос.пользователь возвращает SimpleLazyObject, как мне "разбудить" его?
у меня есть следующий метод:
def _attempt(actor):
if actor.__class__ != User:
raise TypeError
, который вызывается из Вид:
self.object.attempt(self.request.user)
как вы можете видеть, метод _attempt ожидает, что actor будет типом django.contrib.auth.models.User, однако объект, по-видимому, имеет тип django.utils.functional.SimpleLazyObject. Почему это так? И что еще более важно, как я могу преобразовать LazyObject (который, по-видимому, является своего рода оболочкой для объекта пользователя) в
4 ответов:
посмотреть мой ответ на подобный вопрос.
Django ленивые нагрузки
request.userТак что это может быть либоUserилиAnonymousUserв зависимости от состояния аутентификации. Он только "просыпается" и возвращает соответствующий класс, когда атрибут доступен на нем. К сожалению,__class__не считается, потому что это атрибут примитивного класса. Есть случаи, когда вам нужно знать, что это на самом делеSimpleLazyObjectтип, и поэтому было бы неправильно прокси-это наUserилиAnonymousUser.длинные и короткие, вы просто не можете сделать это сравнение как у вас с этим. Но, что ты действительно пытаетесь достичь здесь? Если вы пытаетесь проверить, если это
UserилиAnonymousUser, естьrequest.user.is_authenticated()для этого, например.как правило, хотя, вы не должны злоупотреблять утка набрав. Параметр всегда должен быть определенным типом или подтипом (
UserилиUserSubClass), даже если это не есть быть. В противном случае вы получите запутанный и хрупкий код.
Это должно сделать это:
# handle django 1.4 pickling bug if hasattr(user, '_wrapped') and hasattr(user, '_setup'): if user._wrapped.__class__ == object: user._setup() user = user._wrappedЯ должен был написать это, чтобы я мог добавить пользователя в словарь сеанса. (SimpleLazyObjects не picklable!)
user= request.user._wrapped if hasattr(request.user,'_wrapped') else request.userзатем вы используете
userвместоrequest.user.Это похоже на ответ UsAaR33, но один лайнер лучше для преобразования объекта.
для тех, кто хочет написать не "маленький" unittest для вашего кода, Вы можете создать завернутые
Userи запихнуть его в запрос.from django.contrib.auth import get_user_model from django.test import RequestFactory from django.utils.functional import SimpleLazyObject user = get_user_model().objects.create_user( username='jacob', email='jacob@…', password='top_secret', ) factory = RequestFactory() request = factory.get('/') request.user = SimpleLazyObject(lambda: user)посмотреть:
https://github.com/django/django/blob/master/tests/utils_tests/test_lazyobject.py для текущих тестов на ленивых объектах.
https://docs.djangoproject.com/en/dev/topics/testing/advanced/#django.test.RequestFactory для последняя информация о
RequestFactory.
Comments