2010-12-28 6 views
5

C'è qualche plug-in o back-end di terze parti per gestire le connessioni redis in Django, quindi i metodi in view.py non devono connettersi esplicitamente a redis per ogni richiesta?Django redis back-end di connessione o come implementare uno

In caso negativo, come inizieresti ad implementarne uno? Un nuovo plugin? un nuovo back-end? un nuovo middleware django?

Grazie.

risposta

5

Penso che lo standard emergente per i database non relazionali sia django-nonrel. Non so se django-nonrel è pronto per la produzione o se il supporto viene redisato, ma hanno una guida su writing a custom no-sql backend.

Sfortunatamente, non credo che scrivere supporto per un redis su django standard sia facile come scrivere un DatabaseBackend. C'è molto nei meccanismi e nei flussi di lavoro dei modelli django che semplicemente presuppongono un database ACID. Che mi dici di syncdb? E a proposito di Querysets?

Tuttavia, si può provare a scrivere un approccio povero utilizzando models.Manager e un sacco di ritocchi sul modello. Per esempio:

# helper 
def fill_model_instance(instance, values): 
    """ Fills an model instance with the values from dict values """          
    attributes = filter(lambda x: not x.startswith('_'), instance.__dict__.keys()) 

    for a in attributes: 
     try: 
      setattr(instance, a, values[a.upper()]) 
      del values[a.upper()] 
     except: 
      pass 

    for v in values.keys(): 
     setattr(instance, v, values[v]) 

    return instance 




class AuthorManager(models.Manager): 

    # You may try to use the default methods. 
    # But should be freaking hard... 
    def get_query_set(self): 
     raise NotImplementedError("Maybe you can write a Non relational Queryset()! ") 

    def latest(self, *args, **kwargs): 
     # redis Latest query 
     pass 

    def filter(self, *args, **kwargs): 
     # redis filter query 
     pass 

    # Custom methods that you may use, instead of rewriting 
    # the defaults ones. 
    def open_connection(self): 
     # Open a redis connection 
     pass 

    def search_author(self, *args, **kwargs): 
     self.open_connection() 

     # Write your query. I don't know how this shiny non-sql works. 
     # Assumes it returns a dict for every matched author. 
     authors_list = [{'name': 'Leibniz', 'email': '[email protected]'}, 
         'name': 'Kurt Godel','email': '[email protected]'}] 

     return [fill_instance(Author(), author) for author in authors_list] 



class Author(models.Model): 
    name  = models.CharField(max_length = 255) 
    email  = models.EmailField(max_length = 255) 

    def save(self): 
     raise NotImplementedError("TODO: write a redis save") 

    def delete(self): 
     raise NotImplementedError(""TODO: write a delete save") 

    class Meta: 
      managed = False 

prega di non che ho fatto solo uno schizzo di come è possibile modificare i modelli di Django. Non ho provato ed eseguo questo codice. Prima ti suggerisco di investigare su django-nonrel.

+0

Grazie per la risposta. Non ho bisogno di memorizzare i miei modelli in un'istanza di redis, quindi non credo di aver bisogno di django-nonrel. Implementerò quindi moduli di gestione delle connessioni. – simao

Problemi correlati