Python 为什么Django request.user.is_经过身份验证需要8秒才能执行?
我完全糊涂了。几天前,我的Django应用程序的运行速度明显减慢 事实证明,下面的Django视图Python 为什么Django request.user.is_经过身份验证需要8秒才能执行?,python,django,Python,Django,我完全糊涂了。几天前,我的Django应用程序的运行速度明显减慢 事实证明,下面的Django视图 8秒为授权观众执行 0为匿名用户执行的秒数 def速度测试(请求): 开始=时间。时间()#测量执行时间 b=request.user.is#u authenticated#这不知何故造成了一个问题 response={“test”:“test”}#构造一个虚拟响应 end=time.time() logger.warning(“速度测试:”+str(结束-启动)+“auth=“+str(b)
- 8秒为授权观众执行
- 0为匿名用户执行的秒数
def速度测试(请求):
开始=时间。时间()#测量执行时间
b=request.user.is#u authenticated#这不知何故造成了一个问题
response={“test”:“test”}#构造一个虚拟响应
end=time.time()
logger.warning(“速度测试:”+str(结束-启动)+“auth=“+str(b))#记录
返回HttpResponse(json.dumps(response))
已通过身份验证
可由AbstractBaseUser
中的任何函数替换,结果相同。
如果我删除了对的调用,并且该调用已通过身份验证,那么对每个用户来说,一切都会运行得很快
它是通过runserver
和gunicorn
/uwsgi
复制的
但我无法在我的开发笔记本电脑上复制它,即使连接到同一个远程数据库。所以这看起来不像是一个数据库问题,也绝对不是一个网络问题
Django3.08,Python3.8,ubuntu。尝试制造一个全新的venv-但没有效果
DB连接是默认的:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'user',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'hostname',
'PORT': '5432',
}
}
如果您能提供有关如何解决此问题的任何提示,我将不胜感激。Django lazy加载request.user,以便根据身份验证状态,它可以是user或AnonymousUser。当访问属性时,它仅“唤醒”并返回相应的类。在本例中,我们调用了is\u authenticated
属性,现在它必须调用数据库进行检查。在您的情况下,对db的查询很可能需要很长时间。请求。用户是惰性属性。这意味着Django不会获取登录的用户对象,除非您确实需要它
如果因此使用request.user.is\u authenticated
,则需要对数据库进行查询以获取用户对象。如果没有与登录用户的会话,则检索request.user
会很快,因为它甚至不会查询数据库:如果会话id的会话数据丢失,它只会返回AnonymousUser
对象
如果这是系统进行的第一次查询,则情况会更糟,因为没有打开的连接,因此可能需要额外的逻辑来首先建立到数据库的连接。尤其是众所周知,PostgreSQL在打开连接方面非常昂贵
Django通常会使用开放连接的连接池,并为新查询重用连接。但是,如果这是第一次查询,则池通常是空的,因此需要一些努力才能打开连接并进行查询。因为对于真正的用户request.user。一些属性将需要首先加载用户,从而进行数据库查询。如果池中没有连接,这甚至会导致首先建立数据库连接。我们将对此进行注释。我假设您使用的是postgreSQL数据库?您可以禁用服务器端游标:您是否正在使用DEBUG=True
运行?在这种情况下,每个请求都由一个新线程提供服务,因此在这种情况下会发生这种情况。.is\u authenticated
自Django-1以来已更改为属性。10:抱歉,我的错误!谢谢你提供的信息,谢谢!问题是,这种情况会发生在每个请求上,而不仅仅是第一个请求。只有经过身份验证的用户才能访问访问数据库的视图。我注销了每个用户,以确保他们不会影响性能。但这没用。有没有办法增加池中的连接数,看看是否能让事情变得更好?@AlexeyKalmykov:你能编辑这个问题并显示数据库的设置吗?当然,添加了连接设置-这是默认的postresql。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'user',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'hostname',
'PORT': '5432',
}
}