代码之家  ›  专栏  ›  技术社区  ›  Landon

Django REST框架-正文大小大于1024个字符时的后期慢度

  •  2
  • Landon  · 技术社区  · 7 年前

    我在用DRF。我发现收到一篇超过1024个字符的帖子会导致1秒的惩罚,而任何少于1秒的帖子实际上都是免费的。我把它简化为一个简单的例子:

    # 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 (以证明我访问过它)。

    $ 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
    

    你可以看到第二个有 请求.正文

    为什么?我怎样才能防止这种情况?

    我尽我所能做了这个。我创建了一个新项目 django-admin startproject helloworld_project . . 我把上面的代码放进去了。在本地运行 python manage.py runserver . 我前面没有网络服务器;我直接用浏览器访问它。我就是这么做的。

    另外,我也在做这个 Django==1.11 Django==2.0 . 我无法轻松升级到 2.0 . 有解决这个问题的方法吗 1.11

    1 回复  |  直到 7 年前
        1
  •  0
  •   Community Mohan Dere    6 年前

    让我们深入一点,看看真正的慢在哪里。

    这个 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])
    

    TOTAL TIME: 3.123283386230469e-05

    对于1025个字符: TOTAL TIME: 0.991084098815918


    隐马尔可夫模型。。。这个问题在Django 2.0中已经消失了,让我们看看 release notes

    请求和响应

    runserver Web服务器支持HTTP 1.1。

    chunked transfers 而HTTP1.0则不然。我认为这可以解释这种缓慢的行为。


    在1.11上有解决这个问题的方法吗?

    默认情况下 runserver . 但你不会在生产中使用它,对吗?任何其他生产服务器,如 gunicorn uWSGI 支持HTTP 1.1。

    推荐文章