2009-04-13 112 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