【问题标题】:Blank responses from Django runserver when checking user permissions检查用户权限时来自 Django runserver 的空白响应
【发布时间】:2012-05-11 22:59:14
【问题描述】:

我遇到了与

中列出的问题类似的问题

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

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

不过就像上面提到的问题一样,如果你把一个

print request

request.POST

声明在权限检查之前,NO_PERMISSION_MSG JSON字符串每次都会正确返回给浏览器(error_response_rollback返回一个HttpResponse对象,里面有JSON)

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

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

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

@occ_update 和 @checks_status 装饰器只是捕获异常。无论是否存在,这些问题都会出现。

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

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

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

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

谢谢


更新:

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

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

【问题讨论】:

    标签: python django


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答 :) 我宁愿弄清楚如何在不将其包装在中间件中的情况下做到这一点。
    • @NicholasOrlowski 没问题。这实际上取决于您的视图代码中问题的覆盖范围。如果几行使用它,直接阅读 POST 或稍微调整代码更容易,并且性能更好 =)
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多