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キーワード引数(usernameおよび)を使用してURLルートを定義しましactivation_keyたが、引数のみを使用して呼び出し、テンプレートをキーワード引数に変更します。

{% 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で、その定義と一致しません。そのため、このエラーメッセージが表示されます。単純なパス引数as 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 dirをsite-packagesにコピーします)が、面倒なことなく機能しました。

私は全体的なUserenaアプローチが好きですが、easy-userenaは私が必要とするものにより適しています。

于 2013-01-20T06:56:02.823 に答える