Skip to main content
 首页 » 编程设计

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

2025年05月04日23lautakyan007

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

有没有更好的办法?

请您参考如下方法:

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

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 

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