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

Python Django REST框架-正文大小大于1024个字符时的后期慢度,python,django,django-rest-framework,python-performance,Python,Django,Django Rest Framework,Python Performance,我用的是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() d

我用的是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
并测量执行此操作所需的时间。然后我用时间和
请求.body
的len(证明我访问了它)来响应

然后我执行这些卷曲:

$ 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
您可以看到第二个有一个额外的字符,这会导致准备
request.body
,受到约1秒的惩罚

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

更多信息 我尽可能地做了香草的。我用django admin startproject helloworld\u项目创建了一个新项目。。我把上面的代码放进去了。并使用
python manage.py runserver
在本地运行它。我前面没有Web服务器;我用浏览器直接访问它。这就是我要做的


另外,我正在
Django==1.11
上进行此操作。这个问题似乎在
Django==2.0
上消失了。我无法轻松升级到
2.0
。关于
1.11
是否有解决此问题的方法?

让我们深入了解一下真正的慢度在哪里

这是从属性调用的

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个字符:
总时间:3.123283386230469e-05

对于1025个字符:
总时间:0.991084098815918


嗯。。。这个问题在Django 2.0中消失了,让我们看看:

请求和响应

runserver Web服务器支持HTTP 1.1

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


1.11版是否有解决此问题的方法


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

您使用什么服务器<代码>nginx+uwsgi,
werkzeug
或。。。?我无法用默认的
runserver
重现相同的问题,也无法用werkzeug重现相同的结果。可能需要关于如何部署应用程序的其他信息。我在上面添加了有关我的设置的更多信息。