2009-04-13 81 views
1

我正在写一个django应用程序,用于跟踪哪些电子邮件地址可以将内容发布到用户的帐户。用户可以按照他们的喜好将地址列入白名单和黑名单。python/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 

有没有更好的办法?

回答

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 

拥有一切在一个地方简单得多,你可以用更少的工作做出更有趣的查询。

+0

谢谢,我认为你的第二类方法应该是is_on_blacklist尽管;) – Jiaaro 2009-04-14 12:41:15

3

[请开始所有的类名用大写字母。]

您的代码不使用你的等级区分的非常好。

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

但是,如果他们没有不同的方法,你可能想看看了提供定制manager为每个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 
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 
相关问题