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

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

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

但是就像上面提到的问题一样,如果您输入

print request

request.POST

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

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

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

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

@occ_update 和 @checks_status 装饰器仅捕获异常。无论它们存在还是不存在,这些问题都会发生。

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

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

有谁知道 runserver 命令的任何修复/设置可以在不破坏请求的情况下帮助解决此问题?我的用户主要使用 Chrome,所以我更愿意继续使用它......我们拭目以待。目前使用 Django 1.3.1 在 Windows 中进行开发

我考虑过的一个选择是使用另一个manage.py命令来处理这个问题,但这似乎也很恶心。

谢谢

<小时/>

更新:

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

如果您有类似情况但无法解决,请发表评论。

最佳答案

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

关于python - 检查用户权限时 Django runserver 的空白响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10414264/

相关文章:

python - 当模板不在原始图像上时的模板匹配结果

python - 在 Django 中保存多张图像时出现问题

python - 如何添加基于列值限制外键数量的 Django 约束?

python - 在指定位置提供 django 应用程序 (NGINX)

python - 将 Django 与 virtualenv 一起使用,出现错误 ImportError : No module named 'django.core.servers.fastcgi'

Python 不释放 Linux 中的内存

python - 如何匹配字符后面出现的字符串(如果存在),否则不应匹配任何内容

python - 为 Python 安装 cx_Oracle

django - 使用 'inspectdb' 得到错误 'IndexError: list index out of range'(可能是因为没有一些 FK)。请建议解决方法

python - 用于实现 Python str.count 函数的算法