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

我正在使用Django来build立一个简单的网站。 当你键入基地址(现在是127.0.0.1:8000/)时,我使用django来显示一个视图,它根据你的用户权限进行一些检查并redirect你。 (如果你有pipe理员权限,你去'/pipe理',如果你不去'/ home',如果你没有login,你去'/login')。

当我发出这个HTTP请求时,我会redirect但我也在我的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. “22 N ???? Z'5'Y4 ?????Ť?? UJ)6·4H 2” 400 –

我把第一个hex转换为(空格加上易读性):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') 

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

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

我运行时遇到这种错误:

 manage.py runserver ... 

代替:

 manage.py runfcgi ... 

因为我支持Nginx。

当你使用runserver的时候,它正在监听标准的http请求。 当你使用runfcgi时,它正在监听不同types的请求,使用fastcgi协议而不是普通的http。