python / django中的电子邮件白名单/黑名单

时间:2009-04-13 15:46:11

标签: python django email whitelist blacklist

我正在编写一个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

有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

我会对其进行重组,以便两个列表都包含在一个模型中。

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

将所有内容放在一个地方要简单得多,而且您可以用更少的工作来制作更有趣的查询。

答案 1 :(得分:3)

[请使用大写字母开始所有班级名称。]

您的代码不能很好地利用您的班级区分。

具体来说,您的课程没有任何不同的行为。由于两个类都具有相同的方法,因此不清楚为什么这些是两个不同的类。如果他们有不同的方法,那么你的解决方案是好的。

但是,如果他们没有不同的方法,您可能希望为KnownEmail的两个子集中的每一个提供自定义manager

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

答案 2 :(得分:0)

此类将电子邮件地址与电子邮件域的黑名单进行比较。如果您愿意,可以使用pip install django-email-blacklist下载此模块。

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