【问题标题】:How to debug Django request "POST /url/ HTTP/1.1" 400如何调试 Django 请求“POST /url/ HTTP/1.1”400
【发布时间】:2016-04-19 21:47:10
【问题描述】:

我正在使用 django + django-rest-framework

我正在从 ios 应用程序向本地 python 服务器发送 POST 请求并收到 400 错误代码。我知道问题出在我发送的 json 正文中,我想在某处输出完整的 POST 请求,但我没有运气。

[13/Jan/2016 22:48:45] "POST /url/ HTTP/1.1" 400 75

我不明白如何在运行服务器后打印任何内容(最简单的方法)。有没有可能?

我尝试在设置中启用logging,但也没有成功。

LOGGING = {
    'version': 1,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.request': {
            'handlers':['console'],
            'propagate': True,
            'level':'DEBUG',
        }
    },
}

import logging.config
logging.config.dictConfig(LOGGING)

我还安装了django debug toolbar,但它也没有显示我发送的请求。 我也尝试返回 HttpResponse 但仍然没有得到 POST 请求数据。

在 django 或 django-rest-framework 中输出某处请求数据(控制台、文件或其他任何东西)的方式是什么?

已修复:

我在views.py 中添加了中间件,可以像这样扩展我的控制台输出:

class ExceptionLoggingMiddleware(object):
def process_request(self, request):
    print request.body
    print request.scheme
    print request.method
    print request.META
    return None

不要忘记像这样将此中间件添加到您的设置文件中

MIDDLEWARE_CLASSES = [
'movie.views.ExceptionLoggingMiddleware']

据我了解,我通过设置文件创建的 LOGGING 有效,但输出的信息量不大,只是一些 sql 警告。

【问题讨论】:

  • 错误日志记录,您应该详细说明如何设置日志记录以及“不走运”意味着什么
  • 确保您在设置中设置了ALLOWED_HOSTS
  • @Sayse 我已经编辑了描述。运气不好,我的意思是控制台中没有调试信息,除了[13/Jan/2016 22:48:45] "POST /url/ HTTP/1.1" 400 75

标签: python django django-rest-framework django-debug-toolbar


【解决方案1】:

执行此操作的快速'n'dirty 方法是将调试添加到请求处理程序的入口点。在DjangoRestFramework 类以及基于Django 类的视图中,此入口点是dispatch() 方法。

你可以这样做:

class MyView(View):
    def dispatch(self, request, *args, **kwargs):
        import pdb; pdb.set_trace() # or print debug statements
        super(MyView, self).dispatch(request, *args, **kwargs)

【讨论】:

  • 这个答案很好,因为它在 permission_classes 之前运行,因此您可以检查 request.headers 以查看其中的原因。
【解决方案2】:

如果您在本地运行服务器进行开发,我建议您使用PyCharm。它具有内置的 Django 支持(专业版),因此您可以在调试模式下启动服务器。即使你不买,你也有 30 天的试用期。应该足以找出问题所在。

【讨论】:

    【解决方案3】:

    这是我的解决方案,灵感来自这篇关于 django rest 框架中的错误处理的博文 (https://commitcode.com/custom-error-handler-in-django-rest-framework)

    就我个人而言,我使用 Sentry (https://sentry.com) 来捕获我的异常。但是你可以按照逻辑,放入任何你想要的东西。

    首先,我创建一个自定义异常处理程序,然后使用 Django Rest Framework 的设置进行连接。

    settings.py

    REST_FRAMEWORK = {
        ..settings...
        'EXCEPTION_HANDLER': 'myapp.exception_handler_400.custom_exception_handler'
    }
    

    接下来,我创建了处理实际异常的文件。它只是触发任何现有逻辑,然后检查错误是否为 400。如果是,则将异常触发到 Sentry。

    myapp.exception_handler_400

    from rest_framework.views import exception_handler
    from raven.contrib.django.raven_compat.models import client
    
    def custom_exception_handler(exc, context):
        # Call REST framework's default exception handler first,
        # to get the standard error response.
        response = exception_handler(exc, context)
    
        if response is not None:
    
            if response.status_code == 400:
                client.captureException()
    
        return response
    

    【讨论】:

      【解决方案4】:

      一种选择是将您需要的文本直接查看错误消息,该消息通过 HTTP 400 返回。要实现它,您必须创建自定义处理程序Django 中的 http 400 错误。

      urls.py

      from django.conf.urls import url, include
      
      urlpatterns = [
          url(r'^api/', include('myproject.urls_api')),
      ]
      
      handler400 = 'project.error_handlers.bad_request'
      

      error_handlers.py

      from django import http
      from django.conf import settings
      
      def bad_request(request, *args, **kwargs):
          return http.HttpResponseBadRequest(
              '<h1>Bad Request (400), DEUBG DATA: {}</h1>'.format(settings.ALLOWED_HOSTS),
              content_type='text/html')
      

      就我而言,问题在于 settings.py 中的 ALLOWED_HOSTS 错误

      【讨论】:

        猜你喜欢
        • 2017-07-21
        • 1970-01-01
        • 2022-11-25
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多