首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我有一个中间件,我想要记录每个请求/响应。如何访问POST数据?

我有一个中间件,我想要记录每个请求/响应。如何访问POST数据?
EN

Stack Overflow用户
提问于 2014-07-16 23:38:10
回答 6查看 14.9K关注 0票数 27

我有一个中间件

代码语言:javascript
复制
import logging

request_logger = logging.getLogger('api.request.logger')


class LoggingMiddleware(object):

    def process_response(self, request, response):
        request_logger.log(logging.DEBUG,
               "GET: {}. POST: {} response code: {}. response "
               "content: {}".format(request.GET, request.DATA,
                                       response.status_code,
                                       response.content))
        return response

问题是process_response方法中的请求没有.POST、.DATA或.body。我使用的是django-rest-framework,我的请求有Content-Type: application/json

请注意,如果我将日志记录放到process_request方法中-它具有.body和我需要的一切。但是,我需要在单个日志条目中同时包含请求和响应。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-07-17 23:28:12

这是我做的完整的解决方案

代码语言:javascript
复制
"""
Api middleware module
"""
import logging

request_logger = logging.getLogger('api.request.logger')


class LoggingMiddleware(object):
    """
    Provides full logging of requests and responses
    """
    _initial_http_body = None

    def process_request(self, request):
        self._initial_http_body = request.body # this requires because for some reasons there is no way to access request.body in the 'process_response' method.


    def process_response(self, request, response):
        """
        Adding request and response logging
        """
        if request.path.startswith('/api/') and \
                (request.method == "POST" and
                         request.META.get('CONTENT_TYPE') == 'application/json'
                 or request.method == "GET"):
            request_logger.log(logging.DEBUG,
                               "GET: {}. body: {} response code: {}. "
                               "response "
                               "content: {}"
                               .format(request.GET, self._initial_http_body,
                                       response.status_code,
                                       response.content), extra={
                    'tags': {
                        'url': request.build_absolute_uri()
                    }
                })
        return response

请注意,这

代码语言:javascript
复制
'tags': {
    'url': request.build_absolute_uri()
}

将允许您在哨兵中通过url进行过滤。

票数 11
EN

Stack Overflow用户

发布于 2015-08-27 05:25:23

Andrey的解决方案将在并发请求时中断。您需要将主体存储在request作用域中的某个位置,并在process_response().中获取它

代码语言:javascript
复制
class RequestLoggerMiddleware(object):

    def process_request(self, request):
        request._body_to_log = request.body

    def process_response(self, request, response):
        if not hasattr(request, '_body_to_log'):
            return response

        msg = "method=%s path=%s status=%s request.body=%s response.body=%s"
        args = (request.method,
                request.path,
                response.status_code,
                request._body_to_log,
                response.content)

        request_logger.info(msg, *args)

        return response
票数 7
EN

Stack Overflow用户

发布于 2015-08-15 03:23:34

令人沮丧和惊讶的是,Django中没有易于使用的请求日志记录包。

所以我自己创建了一个。查看:https://github.com/rhumbixsf/django-request-logging.git

使用日志记录系统,因此很容易配置。这是您使用调试级别得到的结果:

代码语言:javascript
复制
GET/POST request url
POST BODY if any
GET/POST request url - response code
Response body
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24784985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档