检查用户权限时,Django runserver的空白响应

时间:2012-05-02 12:58:56

标签: python django

我遇到与

中列出的问题类似的问题

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对象。)

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

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

  1. 用户拥有正确的权限
  2. “打印请求”声明在任何权限检查之前
  3. 您随时都可以使用Firefox。
  4. @occ_update和@checks_status装饰器只捕获异常。无论是否出现这些问题都会出现这些问题。

    我正在开发Chrome和这一切都不是Firefox 中的问题。

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

    有没有人知道runserver命令的任何修复/设置,以帮助解决此问题而不会破坏请求?我的用户主要使用Chrome,因此我更愿意继续使用它......我们会看到。目前正在使用Django 1.3.1在Windows中开发

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

    由于


    更新

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

    如果您遇到类似情况,请评论,但无法弄明白。

1 个答案:

答案 0 :(得分:2)

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