1

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

有没有更好的办法?

4

3 回答 3

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

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

于 2009-04-13T22:17:36.913 回答
3

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

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

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

但是,如果它们没有不同的方法,您可能需要考虑为两个子集的每一个提供一个定制的管理器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
于 2009-04-13T15:54:41.903 回答
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
于 2015-02-02T21:22:17.567 回答