用python/djang发送白名单/黑名单

2024-10-01 13:25:01 发布

您现在位置: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

然后我可以做一些类似的事情:

^{pr2}$

有更好的方法吗?在


Tags: thedjango用户模型应用程序addressmodels电子邮件
3条回答

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

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

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

那么,你的列表就是:

^{pr2}$

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

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

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

[请以大写字母开头。]

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

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

但是,如果它们没有不同的方法,您可以考虑为KnownEmail的两个子集中的每一个子集提供一个自定义的manager

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

相关问题 更多 >