我遇到了与
中列出的类似问题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 对象。)
当您在“打印请求”之前检查权限时,您会得到空白响应,并且他们没有拥有正确的权限。
在以下情况下您不会得到空白回复:
- 用户拥有正确的权限
- “打印请求”语句位于任何权限检查之前
- 您随时使用 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/