2009-04-13 2 views
1

Ich schreibe eine Django-App, die verfolgt, welche E-Mail-Adressen Inhalte auf ein Benutzerkonto veröffentlichen dürfen. Der Benutzer kann Adressen nach Belieben auflisten und auf die schwarze Liste setzen.E-Mail-Whitelist/Blacklist in Python/Django

Beliebige Adressen, die nicht angegeben sind, können entweder per Nachricht behandelt werden oder nur auf die weiße oder schwarze Liste gesetzt werden (wieder benutzerdefiniert).

Hier sind die Django-Modelle, die ich geschrieben habe ... denkst du ist ein guter Weg, es zu tun? Oder sollte ich dem Profilmodell eines Benutzers eine Whitelist und ein Blacklist-Feld hinzufügen?

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 

Dann könnte ich so etwas wie:

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 

Gibt es einen besseren Weg?

Antwort

5

ich, es wäre Umstrukturierung aussehen wollen so wurden beide Listen enthalten in einem Modell.

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

Dann würden Ihre Listen nur sein:

# whitelist 
PermissionList.objects.filter(permission=True) 
# blacklist 
PermissionList.objects.filter(permission=False) 

einen bestimmten Benutzer zu überprüfen, Sie nur ein paar Funktionen zum Modell hinzu:

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 

alles an einem Ort zu haben ist viel einfacher, und Sie können interessantere Abfragen mit weniger Arbeit machen.

+0

danke, ich denke, Ihre zweite Klasse Methode sollte is_on_blacklist obwohl sein;) – Jiaaro

3

[Bitte starten Sie alle Klassennamen mit Großbuchstaben.]

Ihr Code Verwendung Ihrer Klasse Unterscheidung nicht sehr gut machen.

Insbesondere haben Ihre Klassen kein unterschiedliches Verhalten. Da beide Klassen alle die gleichen Methoden haben, ist es nicht klar warum das sind zwei verschiedene Klassen an erster Stelle. Wenn sie unterschiedliche Methoden haben, ist Ihre Lösung gut.

Wenn sie jedoch nicht unterschiedliche Methoden haben, könnten Sie eine maßgeschneiderte auf die Bereitstellung manager für jede der beiden Untergruppen von 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 
0

Diese Klasse vergleicht eine E-Mail-Adresse mit einer Blacklist von E-Mail-Domänen. Wenn Sie es vorziehen, können Sie dieses Modul mit pip install django-email-blacklist herunterladen.

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