Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Django request.user.is_经过身份验证需要8秒才能执行?_Python_Django - Fatal编程技术网

Python 为什么Django request.user.is_经过身份验证需要8秒才能执行?

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)

我完全糊涂了。几天前,我的Django应用程序的运行速度明显减慢

事实证明,下面的Django视图

  • 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',
        }

}