如何调试Django请求" POST / url / HTTP / 1.1" 400

时间:2016-01-14 14:15:50

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

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

我正在从ios app向本地python服务器发送POST请求,并获得400错误代码。我得到的问题是我发送的json正文,我想输出完整的POST请求,但我没有运气。

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

我不知道如何在runserver之后打印任何东西(最简单的方法)。它甚至可能吗?

我已尝试在设置中启用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中输出请求数据(控制台,文件或其他任何内容)的方法是什么?

FIXED:

我在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警告。

4 个答案:

答案 0 :(得分:1)

快速执行此操作的方法是将调试添加到请求处理程序的入口点。在In AppComponent类中,以及基于<my-app/>类的视图中,此入口点是DjangoRestFramework方法。

您可以执行以下操作:

Django

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这是我的解决方案,受到有关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

答案 3 :(得分:0)

一种选择是输入所需的文本以直接查看错误消息(随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错误