在Django书面测试中,如何获取当前登录的用户?

例如,这是我要编写的测试:

def test_author_set_once(self):
    self.client.login(username='Adam', password='password')
    #create an object and test the author is adam
    self.client.login(username='Barry', password='password')
    #modify the first object and test that the author has not changed

所以我想说一些像这样的话.

self.assertEqual(object.author, self.client.user)

(但我不能)

我现在的编码方式是这样的:

self.client.login(username='Adam', password='password')
self.user = User.objects.get(username='Adam')
#create an object 
self.assertEqual(object.author, self.user)

这依赖于request.user与特定用户对象相同的假设.我想还可以,但看起来有点笨重.

有什么办法可以避免这种假设吗?

推荐答案

测试客户端与请求无关.它本身并不保存有关哪些用户登录的信息.(由于显而易见的原因,您的实际Web服务器或Django dev服务器也不是,同样的原因也适用于此).

login只是测试客户端上的一种方便方法,用于本质上模拟使用定义的用户凭据向/login/发送POST.仅此而已.

实际用户可以在request上使用,就像在视图中一样.但是,因为您不能直接访问视图,所以Django在视图的响应上提供了request.在您实际使用测试客户端加载视图后,您可以存储结果,然后通过以下方式获取用户:

response.request.user

Django的最新版本将使用:

response.wsgi_request.user

Django相关问答推荐

Django中每个类型/代理的最新行

如何从基于类的视图将用户保存在 django 模型中

使用OuterRef过滤器获取Django记录的最大值

当从 fastapi 发送请求时,Django 无法对 Postgres 执行查询

从一个组中获取所有用户 - Django

Django中的多对多关系?

Django过滤器查询外键

Django 模型中的隐藏字段

Django Facebook Connect 应用推荐

django.request 记录器没有传播到根目录?

如何在终端中切换 Python 版本?

CherryPy 与 Django

如何使用 SQL 的IN等字段上的数组过滤 django 查询集?

related_name 参数在 Django 模型中没有按预期工作?

Django JavaScript 文件

有日期时间±无穷大吗?

在 Django shell 启动时自动导入模型

暂时禁用 Django 缓存

Django 将多个模型传递给一个模板

如何获取 Django 模型字段对象的值