Django: 400 bad request syntax - 这个消息是啥意思?

Posted

技术标签:

【中文标题】Django: 400 bad request syntax - 这个消息是啥意思?【英文标题】:Django: 400 bad request syntax - what does this message mean?Django: 400 bad request syntax - 这个消息是什么意思? 【发布时间】:2011-12-17 06:50:54 【问题描述】:

我正在使用 django 构建一个简单的网站。当您输入基地址(现在是127.0.0.1:8000/)时,我使用 django 显示一个视图,该视图会根据您的用户权限进行一些检查并重定向您。 (如果你有管理员权限,你去/admin,如果你没有你去/home,如果你没有登录,你去/login。)

当我发出那个 HTTP 请求时,我会得到重定向我应该这样做,但我还在 django 日志中看到以下两个错误:

    代码 400,消息错误请求语法('\x16\x03\x01\x00\x95\x01\x00\x00\x91\x03\x01N\xaa\x9c\x08\x96\x7f\x92\xe9Z\x925\xcaY4\xa6\xa5\xab\xf2\x16\xfaT\x89\xe7\x8a\xc3\x99J)6\xfb\xc44\x00\x00H\xc0') "??N????Z?5?Y4?????T??ÙJ)6??4H?" 400 -

我将第一个中的十六进制翻译为(为便于阅读添加了空格):SYN ETX NUL NUL U SOH NUL NUL Q ETX NUL N 170 156 X r 246 STX 141 214 ? 143 EOT FS j 142 223 s 241 220 < 185 \ \ m 242 &

我当然知道为什么服务器不喜欢这样的请求,但我不知道它来自哪里。

有什么想法吗?

非常感谢。

==============

这是视图的代码:

def index(request):
    user = request.user
    admin_courses = []

    if (user.is_authenticated()):
        u_id = user.getUserId()
        my_enrollment = Enrollment.objects.filter(user_id=u_id)
        admin_enrollment = my_enrollment.filter(type="ADMIN")
        for enr in admin_enrollment:
            course = Course.objects.get(id=enr.getCourseId())
            admin_courses.append(course)
        if (len(admin_courses)>0):
            return HttpResponseRedirect('/admin')
        else:
            return HttpResponseRedirect('/home')
    return HttpResponseRedirect('/login')

【问题讨论】:

也许您应该显示视图的代码。 您是否尝试在重定向后添加斜杠? 是的,它不会改变任何东西。不过是个好主意。 当我们发送空数据时也会出现错误请求。当我在请求中发送一个空数组时,我收到了这个错误,而它本应该是一个非空数组。花了一段时间才弄明白 【参考方案1】:

你可以重构这个维护中间件来获得结果,因为它会在处理内容请求之前检查用户状态,这似乎更 djangonostic..

import settings
from django.http import HttpResponseRedirect


class MaintenanceModeMiddleware(object):
    """
    Maintenance mode for django

    If an anonymous user requests a page, he/she is redirected to the
    maintenance page.
    """
    def process_request(self, request):

        is_login = request.path in (
            settings.LOGIN_REDIRECT_URL,
            settings.LOGIN_URL,
            settings.LOGOUT_URL,
            settings.MAINTENANCE_PATH,
        )
        if (not is_login) and settings.MAINTENANCE and (not request.user.is_authenticated()):
            return HttpResponseRedirect(settings.MAINTENANCE_PATH)
        return None

【讨论】:

你说得对;这是一个更好的 Django 策略。谢谢!【参考方案2】:

为了解决您的实际问题,如果您尝试通过 https 访问 django 服务器,则会发生这种情况。切换回http,这个错误就会消失。

【讨论】:

【参考方案3】:

我在运行时遇到这种错误:

manage.py runserver ...

代替:

manage.py runfcgi ...

因为我支持 nginx

当您使用 runserver 时,它正在侦听标准的 http web 请求。当您使用 runfcgi 时,它正在侦听不同类型的请求,使用 fastcgi 协议而不是普通的 http。

【讨论】:

python3 manage.py runfcgi 0.0.0.0:8001 Unknown command: 'runfcgi' Type 'manage.py help' for usage.

以上是关于Django: 400 bad request syntax - 这个消息是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在 nginx 服务器 rhel 上部署 django 应用程序 - 400 bad request Request Header or cookie too large

记一次400错误引发的血案(URL中特殊符号的转义/400 bad request错误)

调用 HeadObject 操作时发生客户端错误 (400):Bad Request Completed 1 part(s) with ... file(s)

错误 Bad Request (400),当我访问域上的站点时

django dwebsocket bad request

django dwebsocket bad request