我正在使用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
上有针对此问题的解决方法吗?
答案 0 :(得分:0)
让我们更深入地了解真正的缓慢之处。
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
,我相信答案是否。但是您不会在生产中使用它,对吗? gunicorn
,uWSGI
之类的任何其他生产服务器都支持HTTP 1.1。