当前位置: 首页 > 面试题库 >

将请求记录到django-rest-framework

谢叶五
2023-03-14
问题内容

出于调试目的,我想使用Django的日志记录机制来记录每个传入的请求,当它们到达django-rest-framework的家门口时。

Djagno以以下方式(来自settings.py的“ LOGGING”部分)提供其请求的日志记录(仅“警告”日志级别和更高级别):

'django.request': {
        'handlers': ['mail_admins'],
        'level': 'ERROR',
        'propagate': False,
 },

我正在寻求实现以下目标(注意:日志级别为DEBUG):

'rest_framework.request': {
        'handlers': ['logfile'],
        'level': 'DEBUG',
        'propagate': False,
 },

有没有办法在不将记录器嵌入DRF的源代码的情况下做到这一点?
我可能不知道的DRF中是否存在某种“记录后端”选项?


问题答案:

我做了一个泛型RequestLogMiddleware,可以使用将它连接到任何Django Viewdecorator_from_middleware

request_log / middleware.py
import socket
import time


class RequestLogMiddleware(object):
    def process_request(self, request):
        request.start_time = time.time()

    def process_response(self, request, response):

        if response['content-type'] == 'application/json':
            if getattr(response, 'streaming', False):
                response_body = '<<<Streaming>>>'
            else:
                response_body = response.content
        else:
            response_body = '<<<Not JSON>>>'

        log_data = {
            'user': request.user.pk,

            'remote_address': request.META['REMOTE_ADDR'],
            'server_hostname': socket.gethostname(),

            'request_method': request.method,
            'request_path': request.get_full_path(),
            'request_body': request.body,

            'response_status': response.status_code,
            'response_body': response_body,

            'run_time': time.time() - request.start_time,
        }

        # save log_data in some way

        return response

request_log / mixins.py

from django.utils.decorators import decorator_from_middleware

from .middleware import RequestLogMiddleware


class RequestLogViewMixin(object):
    """
    Adds RequestLogMiddleware to any Django View by overriding as_view.
    """

    @classmethod
    def as_view(cls, *args, **kwargs):
        view = super(RequestLogViewMixin, cls).as_view(*args, **kwargs)
        view = decorator_from_middleware(RequestLogMiddleware)(view)
        return view

my_django_rest_api / views.py

from rest_framework import generics

from ...request_log.mixins import RequestLogViewMixin

class SomeListView(
    RequestLogViewMixin,
    generics.ListAPIView
):
    ...


 类似资料:
  • 当我尝试向邮递员发送邮件请求时,仍然会出现这个错误。 我可以从我的DRFlocalhost成功地发出相同的帖子请求,但是当我尝试邮递员时,我得到了上面的错误。 我该怎么解决呢? Views.py Serializers.py urls.py 项目urls.py 更新 我根据评论中的错误消息和指南进行了一些更改,现在可以创建用户了。 问题是,在发送表单中的用户凭据后,我在postman中收到了这个错

  • 我有我的api在Django和Django REST框架(DRF)。 这是我的设置文件: 我得到了坏请求(400)错误: 我查看了Chrome的网络选项卡,我得到的是: 在React中,我得到: 问题是什么,错误背后的原因是什么?API正在工作,我以前没有这个错误。

  • 问题内容: 我已经使用Jackson / JSON对Spring REST进行了很好的设置,并且一切正常。 但是我故意在消息的结构中引入了一个错误,导致400-错误的请求。但是服务器上没有日志输出。我所期望的错误将是“杰克逊未知属性异常”之类的东西,但它被捕获,并且向客户端发送了400错误,但服务器上没有该异常的日志。 我不想明确调试服务器上的所有内容,但是我想要像这样的Spring网络级异常明确

  • 本文向大家介绍django rest framework之请求与响应(详解),包括了django rest framework之请求与响应(详解)的使用技巧和注意事项,需要的朋友参考一下 前言:在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源。当然我们还知道RESTful API的另一个特性就是,发送不同的请求动作,会

  • 我有一些REST服务,我想记录请求和响应。它们接收一个JSON请求并生成另一个JSON响应。我创建了一个拦截器,但无法获取请求/响应正文。这是我的cxf配置: 这是我的拦截器代码: ContextMessageInInterceptor和ContextMessageOutInterceptor工作正常,它们分别转到ContextJSONInInterceptor和ContextJSONOutInt

  • 默认情况下,当凭据错误时,DRF-JWT返回400状态的响应。为什么会这样?当用户没有提供正确的登录信息时,浏览器控制台中会写入错误的请求日志。因此,我在前端处理错误,但仍然没有控制台错误消息。那么,我如何才能超越JWT,不筹集400美元,而是返回成功,正确的方法是什么?