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

时间:2016-02-10 10:08:46

标签: nginx django-rest-framework uwsgi

我正在测试将使用Django REST Framework实现的访问控制的Web服务移植到nginx / uwsgi。当我测试由于用户没有该端点的权限而返回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。
  3. 选项1似乎不是正确的方法 - DRF的权限模块检查用户是否具有端点的访问权限,如果不这样做则拒绝PUT。永远不会访问帖子数据,只应该转储。 选项2似乎解决了问题,但我担心性能以及对其他成功的PUT请求的影响。

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

1 个答案:

答案 0 :(得分:1)

post-buffering将导致uWSGI使用和缓冲正文请求,所以是的,它可能会影响性能,例如,如果有人在未经许可的情况下提出大量请求。 uWSGI将缓冲所有内容,而不仅仅是拒绝。

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