我遇到与
中列出的问题类似的问题Django produces blank pages when POST data is sent and Models are accessed
和
Nginx connection reset, response from uWsgi lost
以下是其中一个观点:
@transaction.commit_on_success
@occ_update
@checks_status
def hold(request):
if not request.user.has_perm('orders.hold'):
return error_response_rollback(NO_PERMISSION_MSG % "hold orders")
order = Order.objects.get(pk=request.POST.get('pk'))
occ_revision = int(request.POST.get('occ_revision'))
agent = Agent.get_agent(request.user)
action = Action(agent=agent, type='hold_order',
comments=request.POST.get('comments'))
action.save()
order.hold(action, occ_revision)
return ok_response_commit("Order held successfully.")
error_response_rollback回滚事务并返回一个HttpResponse,其中包含JSON作为其内容。
我正在为我的应用程序中的许多视图添加权限检查,当用户没有正确的权限时,将返回空白响应。
但是,如上所述,如果你提出一个
print request
或
request.POST
语句在权限检查之前,每次都会正确地将NO_PERMISSION_MSG JSON字符串返回给浏览器(error_response_rollback返回一个带有JSON的HttpResponse对象。)
在“打印请求”之前检查权限并且不拥有正确的权限时,您会收到空白回复。
在以下情况下,您不会得到空白回复:
@occ_update和@checks_status装饰器只捕获异常。无论是否出现这些问题都会出现这些问题。
我正在开发Chrome和这一切都不是Firefox 中的问题。
我发现一个页面建议重载WSGIRequest对象以在将请求传递给视图之前读取请求,但这对我来说似乎很蠢,我宁愿找出真正的解决方案。
有没有人知道runserver命令的任何修复/设置,以帮助解决此问题而不会破坏请求?我的用户主要使用Chrome,因此我更愿意继续使用它......我们会看到。目前正在使用Django 1.3.1在Windows中开发
我考虑过的一个选项就是制作另一个manage.py命令来处理这个问题,但这个问题看起来也很糟糕。
由于
更新
我能够重新组织我的代码,以便在从POST读取一些数据后进行任何权限检查。这似乎已经消除了这个问题的任何症状。它仍然不理想,但它是插入中间件来阅读帖子的一个很好的替代方案。并不总是可以在所有应用程序中使用。
如果您遇到类似情况,请评论,但无法弄明白。
答案 0 :(得分:2)
正如你帖子中的第二个链接所说,特别是http://forum.nginx.org/read.php?2,196581:当你使用Nginx和uWSGI并获得非空POST时,请在返回HttpResponse之前阅读request.POST
。原因在链接中描述
您不必覆盖处理程序,只需将request.POST
行放在返回代码之前,或放在一些装饰器或中间件内。
半年前我在生产站点遇到过这个问题,并把这条线放在一个中间件来解决它。