我正在编写一个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
有更好的方法吗?
答案 0 :(得分: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
将所有内容放在一个地方要简单得多,而且您可以用更少的工作来制作更有趣的查询。
答案 1 :(得分:3)
[请使用大写字母开始所有班级名称。]
您的代码不能很好地利用您的班级区分。
具体来说,您的课程没有任何不同的行为。由于两个类都具有相同的方法,因此不清楚为什么这些是两个不同的类。如果他们有不同的方法,那么你的解决方案是好的。
但是,如果他们没有不同的方法,您可能希望为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
答案 2 :(得分: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