0

我正在尝试通过用户的电子邮件而不是用户名对用户进行身份验证。

我正在使用django-userena并通过使用它的文档等。我设置了几乎所有需要的东西。类似的东西:USERENA_WITHOUT_USERNAMES = True在它的设置等。

但是注册后,我遇到了一系列问题。比如尝试在 url 中传递我的用户名以进行身份​​验证、注册完成问题等。

我更改了一些需要用户名作为参数的视图函数,但是这种方法既没有解决我的问题,也不是正确(也许是安全)的方法。

例如,通过路由到这个 URL http://127.0.0.1:8000/accounts/signup/complete/(之后$ ./manage.py check_permissions)我得到这个错误:

global name 'username' is not defined
/userena/views.py in directto_user_template
user = get_object_or_404(User, username_iexact=username)

有什么我想念的吗?

更新: 这是我得到的输出:

渲染时捕获 NoReverseMatch:使用参数 '('xyz@xyz.com', '70b60d1d97015e03ba8d57f31e4c7ff14d6ab753')' 和关键字参数 '{}' 的“userena_activate”反向。

很明显,userena 尝试将电子邮件作为带有 URL 的用户名:

userena/templates/userena/emails/activation_email_message.txt,第 8 行错误

1   {% load i18n %}{% autoescape off %}
2   {% if not without_usernames %}{% blocktrans with user.username as username %}Dear {{ username }},{% endblocktrans %}
3   {% endif %}
4   {% blocktrans with site.name as site %}Thank you for signing up at {{ site }}.{% endblocktrans %}
5   
6   {% trans "To activate your account you should click on the link below:" %}
7   
8   {{ protocol }}://{{ site.domain }}{% url userena_activate user.username activation_key %}
9   
10  {% trans "Thanks for using our site!" %}
11  
12  {% trans "Sincerely" %},
13  {{ site.name }}
14  {% endautoescape %}

更新2: 好的。通过阅读SignupFormOnlyEmail类形式的源代码,它说自动生成一个随机用户名。

class SignupFormOnlyEmail(SignupForm):
    """
    Form for creating a new user account but not needing a username.

    This form is an adaptation of :class:`SignupForm`. It's used when
    ``USERENA_WITHOUT_USERNAME`` setting is set to ``True``. And thus the user
    is not asked to supply an username, but one is generated for them. The user
    can than keep sign in by using their email.

    """
    def __init__(self, *args, **kwargs):
        super(SignupFormOnlyEmail, self).__init__(*args, **kwargs)
        del self.fields['username']

    def save(self):
        """ Generate a random username before falling back to parent signup form """
        while True:
            username = sha_constructor(str(random.random())).hexdigest()[:5]
            try:
                User.objects.get(username__iexact=username)
            except User.DoesNotExist: break

        self.cleaned_data['username'] = username
        return super(SignupFormOnlyEmail, self).save()

更新 :

我终于解决了这个问题。我也在使用django-email-as-username旁边django-userena。这是我的问题的原因。显然,他们有一些冲突。小心

4

2 回答 2

2

您已经userena_activate使用关键字参数 (usernameactivation_key) 定义了 url 路由,但您只使用参数调用它,将模板更改为关键字参数:

{% url userena_activate username=user.username activation_key=activation_key %}

由于评论而编辑:

我不确定我是否正确理解您的问题,但我认为其他地方存在问题。你的错误信息说:

Caught NoReverseMatch while rendering: Reverse for 'userena_activate' with arguments '('xyz@xyz.com', '70b60d1d97015e03ba8d57f31e4c7ff14d6ab753')' and keyword arguments '{}' not found.

似乎您将有效参数传递给函数,但您以错误的方式传递它们。urls.py 中的 URL 路由以期望的方式定义kwargs,但您只传递了args,这与它的定义不匹配。这就是您收到此错误消息的原因。简单传递参数为kwargs(这意味着每个参数都以其名称和值传递,如上所示)。

urls.py 参数和关键字参数的区别:

url(r'^(?P<username>[\.\w]+)/activate/(?P<activation_key>\w+)/$', userena_views.activate, name='userena_activate'),
         ^ this is _keyword argument_ 'username', expects value with argument value AND name

url(r'^page/(.*)/$', userena_views.ProfileListView.as_view(), name='userena_profile_list_paginated'),
            ^ this is argument, expects only value, not argument name
于 2012-06-28T09:17:06.793 回答
0

使用电子邮件地址作为用户名(有效)的一个非常简单的替代方案是django-easy-userena - 这是 Userena 的向上兼容的分支,它添加了一些不错的功能:

  • 使用电子邮件地址作为有效用户 ID - 生成隐藏在表单和确认电子邮件中的随机数字用户名
  • 更少的依赖 - 不需要 django-guardian 或 easy-thumbnails
  • 内置服务协议字段,显示为复选框

我在这方面取得了很好的效果 - 出于某种原因安装是手动的(将 userena 目录复制到站点包),但它可以轻松工作。

我喜欢整体的 Userena 方法,但 easy-userena 更适合我的需要。

于 2013-01-20T06:56:02.823 回答