使用 Django Rest Framework、nginx 和 uwsgi 处理返回 403 错误的 PUT 请求

Handling PUT requests returning 403 errors with Django Rest Framework, nginx and uwsgi

我正在测试将使用 Django REST Framework 实现的访问受控 Web 服务移植到 nginx/uwsgi。当我测试 return 403 错误的 PUT 请求时,因为用户没有该端点的权限,我有时会在日志中收到这样的错误:

2016/02/09 06:42:05 [error] 574#0: *14978766 readv() failed (104: Connection reset by peer) while reading upstream, client: 10.10.10.10, server: test.whatever.com, request: "PUT /api/1.0/domains/name/Quest/page_content/name/Resit/ HTTP/1.1", upstream: "uwsgi://unix:///tmp/ipp_api_uwsgi.soc:", host: "test.whatever.com"

有一个few questions about this problem。建议的解决方案是:

  1. 或者确保您在 申请或
  2. 使用--post-buffering命令行选项 对于 uwsgi.

选项 1 似乎不是正确的方法 - DRF 的许可模块检查用户是否具有端点的访问权限,如果没有,则拒绝 PUT。 post 数据永远不会被访问,应该被转储。 选项 2 似乎可以解决问题,但我担心性能以及对其他成功 PUT 请求的影响。

选项 2 是我应该遵循的方法吗?还有其他建议吗?

post-buffering 会导致 uWSGI 消耗和缓冲主体请求,所以是的,它会影响性能,例如如果有人在未经许可的情况下发出大量请求。 uWSGI 将缓冲所有它们而不是仅仅拒绝。

但是您可以在 django 应用程序中处理它,使用适当的中间件,当没有执行任何操作的权限时,它只会将所有请求主体放入 /dev/null