Django:400错误的请求语法 - 这个消息是什么意思?

时间:2011-10-28 12:47:53

标签: django http hex ascii http-status-code-400

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

当我发出HTTP请求时,我会重新定向,因为我应该,但我也在django日志中看到以下两个错误:

  1. 代码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')
  2. "??N????Z?5?Y4?????T??ÙJ)6??4H?" 400 -
  3. 我将第一个中的十六进制翻译为(为了易读性添加了空格):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')
    

3 个答案:

答案 0 :(得分:93)

要解决您的实际问题,如果您尝试通过https访问django服务器,则会出现这种情况。切换回http,该错误将消失。

答案 1 :(得分:4)

我跑的时候遇到这种错误:

manage.py runserver ...

而不是:

manage.py runfcgi ...

因为我落后于Nginx。

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

答案 2 :(得分:3)

你可以重构这个维护中间件来实现结果,因为它会在处理内容请求之前检查用户状态,这似乎更像是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