Django REST Framework-正文大小大于1024个字符时POST缓慢

时间:2018-11-08 07:25:16

标签: python django django-rest-framework python-performance

我正在使用DRF。我发现收到超过1024个字符的POST会导致〜1秒的罚款,而少于此的任何内容实际上都是免费的。我已将其简化为这个简单的示例:

using RegionOwners = std::vector<std::array<Player*, 2>>;
RegionOwners regionOwners (11, {nullptr, nullptr});

您可以看到我正在做的 all 是阅读# views.py import time from rest_framework.decorators import api_view from django.http import HttpResponse @api_view(['POST']) def test_endpoint(request): t = time.time() data = request.body total_time = time.time() - t print('got post data:', round(total_time, 3)) return HttpResponse('body size:{} time:{}'.format(len(data), round(total_time, 3))) # url.py urlpatterns = [ url(r'^test_endpoint', test_endpoint), ] 并测量花费的时间。然后我以那个时间和request.body的len来回应(以证明我已访问它)。

然后我执行这些卷发:

request.body

您会看到第二个字符额外有一个一个字符,这导致准备$ time curl -X POST http://127.0.0.1:8000/test_endpoint -d 0123456782345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567901234567890123456789012345678901234567 body size:1024 time:0.0 real 0m0.045s user 0m0.006s sys 0m0.009s $ time curl -X POST http://127.0.0.1:8000/test_endpoint -d 01234567823456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345679012345678901234567890123456789012345678 body size:1025 time:0.999 real 0m1.020s user 0m0.006s sys 0m0.006s 的时间大约为1秒。

那是为什么?我该如何预防?

更多信息

我尽可能地做到了这一点。我使用request.body创建了一个新项目。我把上面的代码放进去了。并使用django-admin startproject helloworld_project .在本地运行。我前面没有网络服务器;我正在使用浏览器直接访问它。这就是我要做的。

此外,我正在python manage.py runserver上执行此操作。这个问题似乎在Django==1.11上消失了。我无法轻松升级到Django==2.0。在2.0上有针对此问题的解决方法吗?

1 个答案:

答案 0 :(得分:0)

让我们更深入地了解真正的缓慢之处。

function属性中调用此body

def read(self, *args, **kwargs):
    self._read_started = True
    try:
        import time
        t = time.time()
        data = self._stream.read(*args, **kwargs)  # HERE(!)
        total_time = time.time() - t
        print('TOTAL TIME: ', total_time)
        return data
    except IOError as e:
        six.reraise(UnreadablePostError, UnreadablePostError(*e.args), sys.exc_info()[2])

对于1024个字符: TOTAL TIME: 3.123283386230469e-05

对于1025个字符:TOTAL TIME: 0.991084098815918


嗯...这个问题在Django 2.0中已经消失了,让我们看看release notes

  

请求和响应

     

runserver Web服务器支持HTTP 1.1。

HTTP 1.1支持chunked transfers,而HTTP 1.0不支持。我认为这可以解释行为缓慢的原因。


  

1.11上是否存在针对此问题的解决方法?

默认使用runserver,我相信答案是。但是您不会在生产中使用它,对吗? gunicornuWSGI之类的任何其他生产服务器都支持HTTP 1.1。