我希望您能帮助我找出使用密码实现手动(服务器端发起)登录without的最佳方式.让我解释一下工作流程:

  • 用户寄存器
  • 谢谢!已向blabla发送了一封包含激活链接的邮箱
  • (帐户现在存在,但标记为未启用)
  • 用户打开邮箱,单击链接
  • (帐户已启用)
  • 谢谢!您现在可以使用该站点

我想做的是在用户点击邮箱链接后登录,这样他就可以立即开始使用网站了.

我不能使用他的密码,因为它在数据库中是加密的,唯一的 Select 是编写自定义身份验证后端吗?

推荐答案

用户登录不需要密码.auth.login function只需要一个User对象,当您启用该帐户时,您可能已经从数据库中获取了该对象.所以你可以直接传给login.

当然,您需要非常小心,以免用户伪造指向已启用的现有帐户的链接,然后该帐户会自动以该用户身份登录.

from django.contrib.auth import login

def activate_account(request, hash):
    account = get_account_from_hash(hash)
    if not account.is_active:
        account.activate()
        account.save()
        user = account.user
        login(request, user)

...等.

Edited:

嗯,我没有注意到使用authenticate的要求,因为它增加了额外的属性.看看代码,它所做的只是一个backend属性,相当于身份验证后端的模块路径.因此,你可以假装它-在上面的登录调用之前,执行以下操作:

user.backend = 'django.contrib.auth.backends.ModelBackend'

Django相关问答推荐

如何在Django表单中传递self.请求数据?

Django ImproperlyConfigured: AUTH_USER_MODEL指向尚未安装的模型'users.User'

在 Django 中按月份和年份对帖子进行分类

如何删除django请求中的重复项

如何在Django中制作一个不 Select 以前日期的日期 Select 器

在Django Rest Framework中按模型属性排序时如何避免重新计算?

Django - 使用在 URL 中传递的父类主键从子类中过滤对象

设置 SECURE_HSTS_SECONDS 可以不可逆转地 destruct 您的网站?

Django:在模板中呈现表单字段时添加 CSS 类

将 **kwargs 传递给 Django 表单

AttributeError:'Manager'对象在Django中没有属性'get_by_natural_key'错误?

Django 从字段开始

为用户添加自定义权限

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

UnicodeEncodeError:ascii编解码器无法编码字符

现在如何在 Django 中处理每个对象的权限?

django admin 排序外键字段列表

Django:如何将数据保存到 ManyToManyField?

如何更改模型标签并给它一个自定义名称

AttributeError:ManyRelatedManager对象没有add属性?