代码之家  ›  专栏  ›  技术社区  ›  Jiaaro

用python/django发送电子邮件白名单/黑名单

  •  1
  • Jiaaro  · 技术社区  · 15 年前

    我正在编写一个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 回复  |  直到 8 年前
        1
  •  5
  •   tghw megawac    15 年前

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

    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
    

    把所有东西放在一个地方要简单得多,你可以用更少的工作来进行更有趣的查询。

        2
  •  3
  •   user1223339    8 年前

    [请以大写字母开头所有类名。]

    你的代码没有很好地利用你的类区别。

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

    但是,如果它们没有不同的方法,您可能希望提供一个定制的 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
    
        3
  •  0
  •   Adrian Lopez    9 年前

    此类将电子邮件地址与电子邮件域的黑名单进行比较。如果您预先输入,您可以使用 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