Django处理请求时性能下降

问题描述 投票:1回答:1

我有一个django平台,当服务器尝试响应一些http请求时,我发现性能很奇怪。

我设法隔离出一些无用的代码,这些代码显示出奇怪的延迟,可以从中得出所有其他延迟。

情况1)如果我具有此功能:

def get_n_events(request):
    a = request.user
    return HttpResponse("5")

响应非常快,如预期的那样:enter image description here

仅12.61ms,非常快,符合预期。

情况2)但如果我具有此功能:

def get_n_events(request):
    a = request.user.username
    return HttpResponse("5")

响应:enter image description here

需要2秒钟以上!

如何解释这种延迟?当我需要访问请求中的数据时,如何避免这么长时间? (例如,在我的情况下,我需要知道request.user.group_name,但是要获得响应需要太多时间。

UPDATE

我使用Django Debug Toolbar进行了一些测试,我看到了很长时间不是由于SQL运行时。enter image description here

如我们所见,SQL仅花费183毫秒,但请求只有1354毫秒。这个时间从哪里来,我该如何减少呢?

django performance httpresponse slowdown
1个回答
1
投票

request.user是一个lazy对象,因此,只要您不要求属性或对其调用str(..)等,就会进行no数据库查询。

确实,如果我们看一下AuthenticationMiddleware [GitHub],我们会看到:

AuthenticationMiddleware

因此class AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request): assert hasattr(request, 'session'), ( "The Django authentication middleware requires session middleware " "to be installed. Edit your MIDDLEWARE setting to insert " "'django.contrib.sessions.middleware.SessionMiddleware' before " "'django.contrib.auth.middleware.AuthenticationMiddleware'." ) request.user = SimpleLazyObject(lambda: get_user(request))会像加载它一样呈现自己,但是只要您不需要它的属性等,它就是promises进行查询的一个proxy对象。如有必要。

© www.soinside.com 2019 - 2024. All rights reserved.