You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 2.1视图中使用self.request.user.is_authenticated是否安全?

你的Django视图与测试问题解答

咱们一步步拆解你遇到的问题:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 11:18:16