【发布时间】:2022-11-24 01:43:24
【问题描述】:
看了文档,还是没有完全掌握User这两个方法的区别:is_active和is_authenticated。
两者都返回一个布尔值。虽然 is_authenticated 是只读的(如果您尝试设置它会出现错误),但可以修改 is_active,例如您可以将其设置为 False 而不是删除帐户。
运行这些命令,将停用用户:
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(pk=10) # get an arbitrary user
>>> u.is_active
True
>>> u.is_active = False # change the value
>>> u.save() # save to make effective
>>> u.is_authenticated
True
现在,该用户仍然通过身份验证,但无法再登录。
登录视图使用authenticate()。停用用户登录失败的实际情况是什么?
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password1']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
要验证您使用authenticate() 的凭据,它会在成功的情况下返回一个User 对象,否则返回 None。我想如果提供的凭据正确但is_active 为假,它会返回 None。
此外,如果is_active 为 False,则 Jinja 块 {% if user.is_authenticated %} 评估为 false,当我认为 user.is_authenticated 为 True 且只读时,这令人困惑。
问题回顾:
当用户被停用时,is_active 为假,is_authenticated(始终)为真。 authenticate()实际上是在检查用户是否处于活动状态但已通过身份验证?是因为is_authenticated是检查用户是否存在的别名吗?但为什么{% user.is_authenticated %} 甚至是假的?
【问题讨论】: