Him*_*rzi 56 python django django-contrib django-users
我有以下方法:
def _attempt(actor):
if actor.__class__ != User:
raise TypeError
Run Code Online (Sandbox Code Playgroud)
从视图中调用:
self.object.attempt(self.request.user)
Run Code Online (Sandbox Code Playgroud)
如您所见,_attempt方法期望actor是类型django.contrib.auth.models.User
,但是对象看起来是类型django.utils.functional.SimpleLazyObject
.为什么会这样?更重要的是,如何将LazyObject
(显然是一种User对象的包装器)转换为User
对象?
有关详细信息,Request.user
请访问:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.user此文档似乎表明request.user
应该是一个User
对象......
======进行后期编辑=====
我现在有以下方法:
def _attempt(obj, action, actor, msg):
actor.is_authenticated()
if isinstance(actor, LazyObject):
print type(actor)
Run Code Online (Sandbox Code Playgroud)
我正在传递一个用户,但if
条件仍然是真的,演员仍然是LazyObject
.为什么会这样?
Chr*_*att 37
Django延迟加载,request.user
以便它可以是User
或者AnonymousUser
取决于身份验证状态.它只会"唤醒"并在访问属性时返回相应的类.不幸的是,__class__
不计算因为这是一个原始的类属性.在某些情况下,您可能需要知道这实际上是一种SimpleLazyObject
类型,因此将其代理到User
或将是错误的AnonymousUser
.
无论长短,你根本无法进行这种比较.但是,你真的想在这里实现什么?如果你想检查它是否是一个User
或者AnonymousUser
,有request.user.is_authenticated()
针对,例如.
但作为一般规则,你不应该滥用鸭子打字.参数应该始终是特殊类型或子类型(User
或UserSubClass
),即使它不是必须的.否则,您最终会遇到令人困惑和脆弱的代码.
UsA*_*R33 16
这应该这样做:
# handle django 1.4 pickling bug
if hasattr(user, '_wrapped') and hasattr(user, '_setup'):
if user._wrapped.__class__ == object:
user._setup()
user = user._wrapped
Run Code Online (Sandbox Code Playgroud)
我必须写这个,所以我可以添加用户到会话字典.(SimpleLazyObjects不可选!)
user= request.user._wrapped if hasattr(request.user,'_wrapped') else request.user
Run Code Online (Sandbox Code Playgroud)
然后你用user
而不是request.user
.
这与UsAaR33的答案类似,但是单行程转换对象更好.
归档时间: |
|
查看次数: |
24331 次 |
最近记录: |