【问题标题】:Creating Users & Sending Password Resets in Django在 Django 中创建用户和发送密码重置
【发布时间】:2016-07-05 21:58:19
【问题描述】:

如果对此已经有了实质性的答案,我深表歉意,我已经搜索了很长时间,但找不到任何有用的答案。

我有一个具有不同级别帐户访问权限的 django 项目。我有一组“经理”,我想让他们管理用户帐户。

我希望经理能够为用户创建用户帐户对象。但是,我不希望他们必须处理创建密码并将其发送给用户(出于显而易见的原因)。这样,管理人员可以模拟用户代表他们完成工作,并且用户可以保持密码控制和数据所有权。

这个想法是管理员创建帐户,当创建帐户时,用户将收到一个密码重置表单(与 django 的开箱即用身份验证相同),允许他们设置密码。

我的代码如下所示(省略了非命令性的东西)

from django.contrib.auth.models import User
from django.contrib.auth.forms import PasswordResetForm

@manager_required
def manager_add_users(request):
    add_user_form = manager_add_user_form(request.POST)
    new_user_name = add_user_form.cleaned_data['user_name']
    new_user_email = add_user_form.cleaned_data['user_email']

    new_user = User.objects.create_user(
        username = new_user_name, 
        email = new_user_email, 
        )
    new_user.save()

    set_password_form = PasswordResetForm({'email': new_user.email })
            if set_password_form.is_valid():
                print 'Reset Form Is Valid'
                set_password_form.save(
                    request= request,
                    use_https=True,
                    from_email="support@org.com",
                    email_template_name='registration/password_reset_email.html')

帐户创建正确,一切正常运行。问题是尽管表单是有效的(重置表单是有效的语句打印),但它实际上并没有发送重置表单。没有表单错误。

但是,在测试中,当我使用系统中已经存在的地址初始化表单时,如下所示:

set_password_form = PasswordResetForm({'email':'existing_address@example.com'})

密码重置表单发送无误。所以它只适用于系统中现有的用户电子邮件地址,但是虽然已经创建了用户并调用了 .save() 方法,但它仍然没有捕捉到它(用户在创建时被标记为“活动”,所以他们应该是能找到)

我有点不知所措。我可以想到一些可以解决这个问题的方法,但这似乎是最直接的方法,我真的不完全确定为什么它不起作用。

是的,我可以发送消息。我正在使用 django 的后端邮件进行测试:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

【问题讨论】:

  • 您没有提及您的电子邮件后端。 Django 本身不发送任何电子邮件,您必须配置电子邮件服务器。在运行测试时,它会替换一个虚拟后端。您是否设置了电子邮件服务器并确认您实际上可以使用它发送电子邮件?
  • 对不起。我正在使用 django 的后端。当我提到我在某些测试用例中成功发送了邮件时,我想很明显我已经配置了一个邮件服务器。我已更新问题以包含我的设置。
  • 感谢您的澄清。我提到它是因为测试可以在没有设置邮件服务器的情况下正常工作,因为 Django 的测试运行程序替代了测试后端。

标签: python django django-1.6


【解决方案1】:

看了source code,Django 似乎忽略了请求,因为密码为空。

在保存用户之前尝试设置一个临时密码(例如使用django.utils.crypto.get_random_string())。

【讨论】:

  • 用电子邮件发送密码是个坏主意。使用 dango-registration 生成令牌并改为发送令牌。从电子邮件中单击令牌后,请阅读它并让用户设置密码。
  • @dmitryro:您所描述的正是 Django 密码重置流程的工作原理。我的回答是关于在数据库中设置一个临时密码,而不是在电子邮件中发送它。
  • 谢谢。这是绝对正确的答案。尽管在没有密码的情况下创建的用户帐户处于活动状态并且可以被管理员模拟,但缺少密码会阻止身份验证发送重置。现在看起来很明显!
猜你喜欢
  • 1970-01-01
  • 2021-09-28
  • 2015-04-24
  • 2021-03-08
  • 2023-03-27
  • 2022-11-24
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
相关资源
最近更新 更多