Python 如何在自定义保存方法中获取当前用户?
我正在使用Django 1.8,我正在尝试实现一个简单的模型日志记录。我已重写该类的save方法。但是,我还想记录哪个用户负责更改,但是请求对象不可用,因为它没有传递到save方法中。我不想在save方法的所有事件中都传递给用户,因为我使用的是django rest framework 这是我的密码:Python 如何在自定义保存方法中获取当前用户?,python,django,django-users,Python,Django,Django Users,我正在使用Django 1.8,我正在尝试实现一个简单的模型日志记录。我已重写该类的save方法。但是,我还想记录哪个用户负责更改,但是请求对象不可用,因为它没有传递到save方法中。我不想在save方法的所有事件中都传递给用户,因为我使用的是django rest framework 这是我的密码: def save(self, *args, **kwargs): order = super(Order, self).save(*args, **kwargs) try:
def save(self, *args, **kwargs):
order = super(Order, self).save(*args, **kwargs)
try:
json_object = serializers.serialize('json', [ order, ])
# I want to log the current user too.
OrderLog.objects.create(order = order, object = json_object)
except Exception as e:
print e
return order
无法在模型的保存方法中获取执行请求的用户,因为模型是独立存在的。
您可以随时调用save方法,即使根本没有请求
因此,在调用save之前/之后,您需要将用户传递给每次save调用,或者需要登录调用save的函数。可以获取当前用户。您必须为它实现自己的小型中间件 您需要以下方法和中间件类 您的中间件文件
from threading import local
_thread_locals = local()
def get_current_user():
return getattr(_thread_locals, 'user', None)
class ThreadLocals( object ):
"""Middleware that gets various objects from the request object and saves them in thread local storage."""
def process_request( self, request ):
_thread_locals.user = getattr( request, 'user', None )
save(self):
from your.path.to.middleware import get_current_user
user = get_current_user()
设置.py
MIDDLEWARE_CLASSES += (
"your.path.to.middleware.ThreadLocals"
)
您的保存方法是
from threading import local
_thread_locals = local()
def get_current_user():
return getattr(_thread_locals, 'user', None)
class ThreadLocals( object ):
"""Middleware that gets various objects from the request object and saves them in thread local storage."""
def process_request( self, request ):
_thread_locals.user = getattr( request, 'user', None )
save(self):
from your.path.to.middleware import get_current_user
user = get_current_user()