如何在apiview中序列化响应对象?

2024-04-19 05:02:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个中间件,它将用户的post,delete..记录在数据库表中。在

class APILogMiddleware(object):
"""
this middle ware will track all api actions
"""
def process_response(self, request, response):
    """
    """
    url = request.path
    try:
        if 'HTTP_X_FORWARDED_FOR' in request.META:
            ip_adds = request.META['HTTP_X_FORWARDED_FOR'].split(",")
            ip_address = ip_adds[0]
        else:
            ip_address = request.META['REMOTE_ADDR']

        user_id = request.user.id if request.user.is_authenticated() else None
        browser = request.META.get('HTTP_USER_AGENT', '')
        action = request.method
        # convert request.REQUEST to dict
        data = dict(request.REQUEST)
        if 'files' in data:
            data.pop("files", None)

        print data

        try:
            response_data = dict(response.data)


        except:
            response_data = {}
        if 'created_at' in response_data.keys():
            response_data.pop('created_at')
        # retrieve token http key
        try:
            token_string = request.META['HTTP_AUTHORIZATION']
            token_string = token_string.replace('Token', '').strip()
            token_string = token_string.replace('token', '').strip()
        except KeyError:
            token_string = None

        log_aok_api_action.apply_async((user_id, ip_address, browser, url, action, data, response_data,
                                        token_string), expires=60)
    except ConnectionError as e:
        pass
    return response

在视图.py在

^{pr2}$

当我进入主页时,我收到了一条错误消息,我尝试了json.dumps文件(响应_数据),并且有效。 但当我回答时json.dumps文件(响应数据) 然后我将这个json字符串传递到log-auk-yu-api_action.apply_异步它还是给我同样的错误。尴尬. 在

<django.utils.functional.__proxy__ object at 0xb4d713ec> is not JSON serializable

在模型.py在

class ApiLog(models.Model):
""" ApiLog
"""
user = models.BigIntegerField(_('User'), blank=True, null=True)
token = models.CharField(_('Token Key'), max_length=255, null=True, blank=True)
ip_address = models.IPAddressField()
browser = models.CharField(_('Browser'), max_length=256, null=True, blank=True)
url = models.CharField(_('URL'), max_length=256, null=True, blank=True)
action = models.CharField(_('Action'), max_length=100, null=True, blank=True)
data = JSONField(_('Data'), blank=True, null=True)
response_data = JSONField(_('Response Data'), blank=True, null=True)

country = models.CharField(_('Country'), max_length=100, null=True, blank=True)

created_at = models.DateTimeField(auto_now_add=True)

objects = ApiLogManager()

class Meta:
    app_label = 'extra'

@property
def username(self):
    return User.objects.get(id=self.user) if self.user else ''

def __str__(self):
    # Use django.utils.encoding.force_bytes() because value returned is unicode
    return force_bytes('user %s performed %s' % (self.user, self.action))

def __unicode__(self):
    return u'user %s performed %s' % (self.user, self.action)

Tags: selfiptokentruedatastringifmodels