Django rest框架覆盖自定义日志的初始值会绕过OAuth初始化
我肯定python中的类型层次结构和初始化有一些我不了解的地方。。。 我想用django rest框架记录帖子主体,就像建议的那样:覆盖初始和最终的_响应 这就是我的mixin的样子:Django rest框架覆盖自定义日志的初始值会绕过OAuth初始化,django,django-rest-framework,Django,Django Rest Framework,我肯定python中的类型层次结构和初始化有一些我不了解的地方。。。 我想用django rest框架记录帖子主体,就像建议的那样:覆盖初始和最终的_响应 这就是我的mixin的样子: class LoggingMixin(object): """ Provides full logging of requests and responses """ def finalize_response(self, request, response, *args, **kwargs): # d
class LoggingMixin(object):
"""
Provides full logging of requests and responses
"""
def finalize_response(self, request, response, *args, **kwargs):
# do the logging
if settings.DEBUG:
logger.debug("[{0}] {1}".format(self.__class__.__name__, response.data))
return super(LoggingMixin, self).finalize_response(request, response, *args, **kwargs)
def initial(self, request, *args, **kwargs):
# do the logging
if settings.DEBUG:
try:
data = request._data
logger.debug("[{0}] {1}".format(self.__class__.__name__, data))
except exceptions.ParseError:
data = '[Invalid data in request]'
super(LoggingMixin, self).initial(self, request, *args, **kwargs)
我的看法是:
class BulkScan(LoggingMixin, generics.ListCreateAPIView):
"""
Provides get (list all) and post (single) for scans.
"""
queryset = Scan.objects.all()
serializer_class = ScanSerializer
authentication_classes = (OAuth2Authentication,)
permission_classes = (IsAuthenticated,)
# insert the user on save
def pre_save(self, obj):
for scan in obj:
scan.user = self.request.user
def post(self, request, *args, **kwargs):
serializer = ScanSerializer(data=request.DATA, many=True)
if serializer.is_valid():
self.pre_save(serializer.object)
self.object = serializer.save(force_insert=True)
self.post_save(self.object, created=True)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED,
headers=headers)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
但是,post或get请求失败,抱怨request.user属性不存在。这必须自动注射到那里。如果我没有覆盖initial
,那么一切都很好,并且在调用APIView.initial
时设置用户
现在,我求助于重写get
和post
,然后记录post正文的内容,但我不明白为什么在重写方法时没有设置user属性
非常感谢您对这一问题的任何澄清。您认为initial的超级实现是错误的。不要通过
self
:
super(LoggingMixin, self).initial(request, *args, **kwargs)
希望这能解决问题——似乎没有其他问题。@carlton gibson是正确的,但还有一件事。我也有同样的问题。在进行日志记录之前,通过调用super()的
initial()
修复了此问题
def initial(self, request, *args, **kwargs):
# do the logging
result = super(LoggingMixin, self).initial(request, *args, **kwargs)
if settings.DEBUG:
try:
data = request._data
logger.debug("[{0}] {1}".format(self.__class__.__name__, data))
except exceptions.ParseError:
data = '[Invalid data in request]'
return result
可惜没有。这说明
super(LoggingMixin).initial(self,request,*args,**kwargs)AttributeError:“super”对象没有属性“initial”
Erm。。。我的意思是不要把self传递给initial
。(请参见答案中的代码。)