1

我有与列出的问题类似的问题

发送 POST 数据并访问模型时,Django 会产生空白页

Nginx 连接重置,uWsgi 的响应丢失

以下是有问题的观点之一:

@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 回滚事务并返回一个以 JSON 作为其内容的 HttpResponse。

我正在为我的应用程序中的许多视图添加权限检查,当用户没有正确的权限时,会返回空白响应。

然而,就像上面提到的问题一样,如果你把

print request

或者

request.POST

语句在权限检查之前,每次都正确地将 NO_PERMISSION_MSG JSON 字符串返回给浏​​览器(error_response_rollback 返回一个带有 JSON 的 HttpResponse 对象。)

当您在“打印请求”之前检查权限并且它们没有正确的权限时,您会得到空白响应。

在以下情况下,您不会收到空白回复:

  1. 用户具有正确的权限
  2. “打印请求”语句在任何权限检查之前
  3. 您可以随时使用 Firefox。

@occ_update 和 @checks_status 装饰器只是捕获异常。这些问题在存在和不存在的情况下都会发生。

我正在使用 Chrome 进行开发,这在 Firefox 中都不是问题

我发现一页建议重载 WSGIRequest 对象以在将请求传递给视图之前读取请求,但这对我来说似乎很恶心,我宁愿找出真正的解决方案。

有没有人知道 runserver 命令的任何修复/设置来帮助解决这个问题而无需破解请求?我的用户主要使用 Chrome,所以我更愿意继续使用它……我们拭目以待。目前使用 Django 1.3.1 在 Windows 中开发

我考虑过的一个选择是制作另一个 manage.py 命令来处理这个问题,但这也似乎很糟糕。

谢谢


更新:

我已经能够重新组织我的代码,以便在从 POST 读取一些数据后进行任何权限检查。这似乎消除了这个问题的任何症状。它仍然不理想,但它是插入中间件以阅读帖子的好选择。并且并非总是在所有应用程序中都是可能的。

如果您有类似的情况并且无法弄清楚,请发表评论。

4

1 回答 1

2

正如您帖子的第二个链接中所说,特别是http://forum.nginx.org/read.php?2,196581:当您使用 Nginx 和 uWSGI 工作并获得非空 POST 时,请始终阅读request.POST之前的返回一个 HttpResponse。原因在链接中描述。
您不必重写处理程序,只需将该request.POST行放在返回代码之前,或者放在一些装饰器或中间件中。
半年前在生产现场遇到这个问题,把线路放在中间件中解决。

于 2012-05-02T13:18:15.900 回答