gpt4 book ai didi

python - 为什么使用 Django REST Framework 处理 POST 请求对于大于 1024 个字符的正文大小会变慢?

转载 作者:行者123 更新时间:2023-12-05 06:29:47 26 4
gpt4 key购买 nike

我正在使用 DRF。我发现接收超过 1024 个字符的 POST 会导致约 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)))

网址.py:

urlpatterns = [
url(r'^test_endpoint', test_endpoint),
]

您可以看到我正在做的全部是读取request.body 并测量这样做所花费的时间。然后我用那个时间和 request.body 的 len 来回应(以证明我访问了它)。

然后我执行这些 curl :

$ 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

你可以看到第二个有 一个 额外的字符,这会导致 ready request.body 延迟约 1 秒。

这是为什么呢?我怎样才能避免这种情况?

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

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

最佳答案

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

functionbody 调用属性(property)。

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中没有了,我们看看release notes :

Requests and Responses

The runserver Web server supports HTTP 1.1.

HTTP 1.1 支持 chunked transfers而 HTTP 1.0 则没有。我认为这可以解释缓慢的行为。


Is there a workaround for this issue on 1.11?

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

关于python - 为什么使用 Django REST Framework 处理 POST 请求对于大于 1024 个字符的正文大小会变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53203078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com