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

Jia*_*aro 1 python email django 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
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

tgh*_*ghw 5

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

class PermissionList(models.Model):
    setter = models.ManyToManyField(User)
    email = models.EmailField(unique=True) #don't want conflicting results
    permission = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)

然后,您的列表将是:

# whitelist
PermissionList.objects.filter(permission=True)
# blacklist
PermissionList.objects.filter(permission=False)
Run Code Online (Sandbox Code Playgroud)

要检查特定用户,只需向模型添加几个函数:

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
Run Code Online (Sandbox Code Playgroud)

将所有内容集中在一个地方要简单得多,您可以用更少的工作来创建更有趣的查询.