我有一个django平台,当服务器尝试响应一些http请求时,我发现性能很奇怪。
我设法隔离出一些无用的代码,这些代码显示出奇怪的延迟,可以从中得出所有其他延迟。
情况1)如果我具有此功能:
def get_n_events(request):
a = request.user
return HttpResponse("5")
仅12.61ms,非常快,符合预期。
情况2)但如果我具有此功能:
def get_n_events(request):
a = request.user.username
return HttpResponse("5")
需要2秒钟以上!
如何解释这种延迟?当我需要访问请求中的数据时,如何避免这么长时间? (例如,在我的情况下,我需要知道request.user.group_name,但是要获得响应需要太多时间。
UPDATE
我使用Django Debug Toolbar进行了一些测试,我看到了很长时间不是由于SQL运行时。
如我们所见,SQL仅花费183毫秒,但请求只有1354毫秒。这个时间从哪里来,我该如何减少呢?
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对象。如有必要。