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)