1

アカウントの単純なアクティベーション キーの場合、別のアカウントと同じキーを使用していないことを確認しながら、乱数からキーを作成する必要があります。今、これは私が持っているものです:

def get_random_word():
    word = ''
    i = 0
    while i in range(10) and User.objects.filter(activation_key = word).exists():
        word += random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
        i+=1
    return word

私が今気付いた問題は、次のUserようなユーザープロファイルでdjangoの組み込みクラスを使用していることです。

def create_user_info(sender, instance, created, **kwargs):
    if created:
        UserInfo.objects.create(user=instance)

post_save.connect(create_user_info, sender=User)


class UserInfo(models.Model):
    user = models.OneToOneField(User)
    pen_name = models.CharField(max_length=30)
    activated = models.BooleanField()
    activation_key = models.CharField(max_length=40)
    def __unicode__(self):
        return self.email + '-' + self.pen_name

ユーザープロファイルでフィルタリングする必要があります。要するに、キー、より具体的にはユーザー プロファイルでフィルター処理するにはどうすればよいでしょうか。

4

4 に答える 4

1

まず、2人のユーザーが同じアクティベーションキーを持っているかどうかは気にしません。このケースは非常にまれであるため、いかなる種類の攻撃のターゲットにもなり得ません。

次に、アクティベーションURLにユーザー名を含めてみませんか?このようにして、ユーザーごとに一意のアクティベーションURLを確保できます。 ex: yourwebsite.com/users/activate/{username}/{activationcode}

第三に、ランダムの代わりにUUIDを使用できます。UUIDは一意であることが許可されています(正確ではありませんが、99.99%の確率で)。 http://docs.python.org/library/uuid.html

第4に、プロファイル情報にアクティベーションコードを保持する必要が本当にありますか?独立したアクティベーションテーブルを作成してみませんか。主キーをアクティベーションコードに設定することもできます。ほとんどの場合、あまり使用されない情報と、頻繁に使用する情報を分離することをお勧めします。

第5に、Userテーブルをクエリする必要はまったくありません。UserProfileテーブルを照会し、アクティベーションキーが存在するかどうかを確認する必要があります。その後、その場合にのみ、OneToOneリレーションを使用して元のユーザーにマップできます。

于 2012-08-08T02:03:10.163 に答える
1

あなたが達成したいことを正確に100%確信しているわけではありませんが、あなたのニーズに合った2つの答えがあります:

一般的

最初に、Django 組み込みユーザー モデルをモデルに接続する必要がありますUserProfile。これは、settings.py設定のAUTH_PROFILE_MODULE設定で行われます

AUTH_PROFILE_MODULE = 'myapp.UserProfile'    # replace `myapp` with your application name

答え 1

がの既存のインスタンスであるとuser.get_profile()仮定することで、特定のユーザーのユーザー プロファイルを取得できます。userdjango.contrib.auth.User

答え 2

UserProfile最初にクエリしたいキーでモデルをクエリしてから、結果セットをユーザーに直接マップすることができます。次に例を示します。

from myapp.models import UserProfile

profiles = UserProfile.objects.filter(activation_key='abcdef')
for profile in profiles:
    print profile.user    # this is the profiles connected user instance
于 2012-08-08T01:54:20.997 に答える
0

ユーザー関係に related_name 値を追加する必要さえありません。次のクエリは、プロファイル モデルで機能します。

User.objects.filter(userinfo__activation_key=word).exists()
于 2015-01-08T23:24:23.460 に答える