Django 2.1视图中使用self.request.user.is_authenticated是否安全?
咱们一步步拆解你遇到的问题:
1. 在视图中使用self.request.user.is_authenticated是否安全?生产环境会失效吗?
完全安全,而且在生产环境只要你的Django配置正确,就不会失效。
Django的AuthenticationMiddleware会在请求处理过程中,把当前认证的用户附加到request.user上——只要你在settings.MIDDLEWARE里配置了这个中间件(默认是开启的),正常请求下self.request.user肯定存在。你现在的报错只出现在测试里,和生产环境逻辑无关。
另外提一句:Django 2.1里is_authenticated是属性(不是方法),你的写法是对的,不用加括号。
2. RequestFactory是否未包含user属性?
没错,RequestFactory只是用来模拟HTTP请求的工具,它不会走完整的Django中间件栈,所以默认不会给请求附加user属性。这就是你测试报错AttributeError: 'WSGIRequest' object has no attribute 'user'的核心原因。
3. 如何修复测试?
你需要手动把用户附加到模拟的请求上,修改测试代码即可:
def test_find_user_by_exact_slug(self): # 先创建独立的请求对象 request = self.factory.get('/look-at-me/some-page/') # 手动将测试用户绑定到请求上 request.user = self.user # 再调用视图,传入请求和slug参数 view = UserMixinTestView.as_view()(request, slug='look-at-me') self.assertEqual(first=view.get_user().id, second=self.user.id)
ActiveUserFactory创建的用户是激活状态,手动赋值request.user后,request.user.is_authenticated会自动返回True(这是Django User模型的默认属性),完全满足视图的判断逻辑。
4. 测试代码中slug='look-at-me'的作用是什么?
这是传给视图的URL关键字参数。
在正常的Django路由配置中,你可能会有类似这样的规则:
path('<slug:slug>/some-page/', UserMixinTestView.as_view())
Django会自动从URL里提取slug参数,传给视图的处理方法。但RequestFactory只会模拟HTTP请求的内容,不会解析URL里的参数到视图的kwargs中,所以你需要手动把这些参数作为关键字参数传给视图调用,这样视图才能拿到slug值去查找对应的用户。
内容的提问来源于stack exchange,提问作者Uri

