5 Stimmen

Django Redis-Verbindungssicherung oder wie man eine implementiert

Gibt es ein Plugin oder ein Backend von Drittanbietern, um Redis-Verbindungen in Django zu verwalten, sodass die Methoden in view.py nicht für jede Anfrage explizit eine Verbindung zu Redis herstellen müssen?

Wenn nicht, wie würden Sie mit der Implementierung beginnen? Ein neues Plugin? Ein neues Backend? Ein neuer Django-Middleware?

Danke.

5voto

Frangossauro Punkte 3966

Ich denke, der aufstrebende Standard für Nicht-Rel-Datenbanken ist django-nonrel. Ich weiß nicht, ob django-nonrel produktionsbereit ist oder ob es Redis unterstützt, aber sie haben eine Anleitung zum Schreiben eines benutzerdefinierten No-SQL-Backends.

Leider glaube ich nicht, dass es einfach ist, Unterstützung für Redis auf einem Standard-Django zu schreiben wie ein DatabaseBackend. Es gibt viele Mechaniken und Abläufe in den Django-Modellen, die einfach von einer ACID-Datenbank ausgehen. Was ist mit syncdb? Und was ist mit Querysets?

Sie können jedoch versuchen, einen einfachen Ansatz zu schreiben, indem Sie models.Manager und viel Feinabstimmung auf Ihrem Modell verwenden. Zum Beispiel:

# Helfer
def fill_model_instance(instance, values):
    """Füllt eine Modellinstanz mit den Werten aus dem Wörterbuch Werte auf"""
    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):

    # Sie können versuchen, die Standardmethoden zu verwenden.
    # Aber es sollte verdammt schwer sein ...
    def get_query_set(self):
        raise NotImplementedError("Vielleicht können Sie ein nicht relationales Queryset() schreiben! ")

    def latest(self, *args, **kwargs):
        # redis Aktuelle Abfrage
        pass

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

    # Benutzerdefinierte Methoden, die Sie verwenden können, anstatt sie neu zu schreiben
    # die Standardmöglichkeiten.
    def open_connection(self):
        # Öffnen einer Redis-Verbindung
        pass

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

        # Schreiben Sie Ihre Abfrage. Ich weiß nicht, wie dieses glänzende nicht-SQL funktioniert.
        # Geht davon aus, dass es für jeden übereinstimmenden Autor ein Wörterbuch zurückgibt.
        authors_list = [{'name': 'Leibniz', 'email': 'iinventedcalculus@gmail.com'},
                         'name': 'Kurt Godel', 'email': 'self.consistent.error@gmail.com'}]

        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: Schreiben Sie einen Redis-Speicher")

     def delete(self):
         raise NotImplementedError("TODO: Schreiben Sie einen Löschspeicher")

     class Meta:
          managed = False

Bitte beachten Sie, dass ich nur eine Skizze gemacht habe, wie Sie die Django-Modelle anpassen können. Ich habe diesen Code nicht getestet und ausgeführt. Ich schlage zunächst vor, dass Sie django-nonrel untersuchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X