белый список/черный список электронной почты в python/django

Я пишу приложение django, которое отслеживает, какие адреса электронной почты могут публиковать контент в учетной записи пользователя. Пользователь может вносить адреса в белый и черный список по своему усмотрению.

Любые адреса, которые не указаны, могут быть обработаны для каждого сообщения или просто по умолчанию включены в белый или черный список (опять же, указанный пользователем).

Вот модели django, которые я написал... как вы думаете, это хороший способ сделать это? или я должен добавить поле белого и черного списка в модель профиля каждого пользователя?

class knownEmail(models.Model):
    # The user who set this address' permission, NOT
    # the user who the address belongs to...
    relatedUser = models.ManyToManyField(User)
    email = models.EmailField()

class whiteList(knownEmail):
    pass

class blackList(knownEmail):
    pass

Тогда я мог бы сделать что-то вроде:

def checkPermission(user, emailAddress):
    "Check if 'emailAddress' is allowed to post content to 'user's profile"
    if whiteList.objects.filter(relatedUser=user, email=emailAddress):
        return True
    elif blackList.objects.filter(relatedUser=user, email=emailAddress):
        return False
    else:
        return None

Есть ли способ лучше?


person Jiaaro    schedule 13.04.2009    source источник


Ответы (3)


Я бы реструктурировал его так, чтобы оба списка содержались в одной модели.

class PermissionList(models.Model):
    setter = models.ManyToManyField(User)
    email = models.EmailField(unique=True) #don't want conflicting results
    permission = models.BooleanField()

Тогда ваши списки будут такими:

# whitelist
PermissionList.objects.filter(permission=True)
# blacklist
PermissionList.objects.filter(permission=False)

Чтобы проверить конкретного пользователя, вы просто добавляете в модель пару функций:

class PermissionList(...):
    ...
    @classmethod
    def is_on_whitelist(email):
        return PermissionList.objects.filter(email=email, permission=True).count() > 0

    @classmethod
    def is_on_blacklist(email):
        return PermissionList.objects.filter(email=email, permission=False).count() > 0

    @classmethod
    def has_permission(email):
        if PermissionList.is_on_whitelist(email):
            return True
        if PermissionList.is_on_blacklist(email):
            return False
        return None

Иметь все в одном месте намного проще, и вы можете делать более интересные запросы с меньшими затратами труда.

person tghw    schedule 13.04.2009
comment
спасибо, я думаю, что ваш метод второго класса должен быть is_on_blacklist;) - person Jiaaro; 14.04.2009

[Пожалуйста, начинайте все имена классов с заглавных букв.]

Ваш код не очень хорошо использует ваше различие классов.

В частности, ваши классы не имеют никакого другого поведения. Поскольку оба класса имеют одни и те же методы, неясно, почему это вообще два разных класса. Если у них разные методы, то ваше решение хорошее.

Однако, если у них нет разных методов, вы можете рассмотреть возможность предоставления индивидуальной менеджер для каждого из двух подмножеств KnownEmail

class WhiteList( models.Manager ):
    def get_query_set( self ):
        return super( WhiteList, self ).get_query_set().filter( status='W' )

class BlackList( models.Manager )
    def get_query_set( self ):
        return super( BlackList, self ).get_query_set().filter( status='B' )

class KnownEmail( models.Model ):
    relatedUser = models.ForeignKey(User)
    email = models.EmailField()
    status = models.CharField( max_length=1, choices=LIST_CHOICES )
    objects = models.Manager() # default manager shows all lists
    whiteList= WhiteList() # KnownEmail.whiteList.all() is whitelist subset
    blackList= BlackList() # KnownEmail.blackList.all() is blackList subset
person S.Lott    schedule 13.04.2009

Этот класс сравнивает адрес электронной почты с черным списком доменов электронной почты. Если вы предпочитаете, вы можете загрузить этот модуль, используя pip install django -черный список адресов электронной почты.

from django.conf import settings
import re

class DisposableEmailChecker():
"""
Check if an email is from a disposable
email service
"""

    def __init__(self):
        self.emails = [line.strip() for line in   open(settings.DISPOSABLE_EMAIL_DOMAINS)]

    def chunk(self, l, n):
        return (l[i:i + n] for i in range(0, len(l), n))

    def is_disposable(self, email):
        for email_group in self.chunk(self.emails, 20):
            regex = "(.*" + ")|(.*".join(email_group) + ")"
                if re.match(regex, email):
                    return True
                return False
person Adrian Lopez    schedule 02.02.2015