2012-03-30 4 views
1

Ich habe eine Webanwendung eingebaut in Django + Python, die mit Webdiensten interagieren (geschrieben in JAVA).Wie alle Benutzeraktivitäten in einer Website gespeichert werden ..?

Nun ist der ganze Datenbank-Management- Teil von Web-Service das heißt alle CRUD Operationen aktuelle Datenbank wird durch Web-Service getan getan.


Jetzt habe ich auf Spur alle Benutzeraktivitäten auf meiner Website getan in einige Log-Tabelle.

Wie Wenn der Nutzer einen neuen Artikel geschrieben, dann wird eine neue Zeile in Artikel erstellt wird Tabelle von Web-Services und nebeneinander, ich brauche, eine neue Zeile in Log-Tabelle etwas hinzufügen wie "Benutzer : Raman hat einen neuen Artikel geschrieben (mit Ausweis, Titel etc.) "

ich habe dies wie in meiner Datenbank für alle Objekte zu tun‚Artikel‘,‚Medien‘,‚Kommentare‘etc


Hinweis: Ich bin mit PostgreSQL


Also, was das ist beste Weg Um dies zu erreichen .. ?? (Sollte ich sie in PostgreSQL OR JAVA .. ?? .. und wie .. ??)

Antwort

1

So haben Sie UI <-> Web Services <-> DB

Da die Webdiensten Rede an die DB und die Web-Services enthalten die Business-Logik (dh ich denke, man Sachen dort zu validieren, Ihre Abfragen erstellen und ausführen), dann Der beste Ort zum "Loggen" von Aktivitäten ist in den Diensten selbst.

IMO, Protokollierung PostgreSQL Transaktionen ist eine andere Sache. Es ist nicht mehr dasselbe wie das Protokollieren von Benutzeraktivitäten.

EDIT: Dies bedeutet immer noch, Sie erstellen DB-Schema für 'Protokolle' und schreiben sie in die DB.

Zweite EDIT: Fangen log würdig Ereignisse in der UI und Protokollierung sie dann von dort nicht die beste Idee, entweder sein könnte. Sie müssen die Protokollierung neu schreiben, wenn Sie sich dazu entschließen, die Benutzeroberfläche zu ersetzen oder beispielsweise eine alternative Benutzeroberfläche für z. B. mobile Geräte oder etwas anderes zu schreiben.

+0

Ich frage mich, ob wir 'Triggers' in' PostgreSQL' schreiben, das die Log-Tabelle füllen würde, wenn eine neue Zeile in Artikel, Medien, Kommentare usw. eingefügt wird. Ist das eine gute Idee ?? –

+0

Hängt davon ab. Was, wenn Sie in Zukunft eine Situation haben, in der ein Benutzer einen Artikel hochladen kann, der Medien enthält (möglich, oder?) Und dies in einem einzigen Web-Service-Anruf behandelt wird? – ArjunShankar

+0

Wahr .. !! .. ich werde es sehen .. !! .. tatsächlich sind die Dienste alle komplett .. !! .. ich denke, ich muss nicht einen zusätzlichen Code..new thanx ..! ! –

0

In Ihrem Log-Tabelle können Sie verschiedene Spalten haben, darunter:

  • user_id (der Benutzer, der die Aktion) hat
  • activity_type (die Art der Tätigkeit, wie view oder commented_on)
  • object_id (das eigentliche Objekt, dass es sich, wie der Artikel oder Medien)
  • object_type (die Art des Objekts; dies kann später in Kombination mit object_id verwendet werden, um das Objekt in der Datenbank zu suchen.)

Auf diese Weise können Sie alle Aktionen der Benutzer verfolgen. Sie müssen diese Tabelle aktualisieren, wenn etwas passiert, das Sie verfolgen möchten.

+0

das, was ich fragte .. bestmögliche Lösung, um diese Tabelle zu aktualisieren .. ?? ... sollte ich es tun in der 'PostGreSQL' ODER' JAVA' .. ?? .. und Wie .. ?? –

+0

Solch eine Tabelle ist ziemlich gut, aber sie kann sehr schnell wachsen, auch wenn kleine Websites 50K Mitglieder haben. Wenn nur diese Tabelle 10x schneller wächst als die Datenbank, wie wir sie sauber halten? – brsbilgic

0

Wann immer wir dies tun mussten, übersteuerten wir Signale für jedes Modell und jede mögliche Aktion.

https://docs.djangoproject.com/en/dev/topics/signals/

Sie das Signal haben können tun, was Sie wollen, von etwas HTML-Code in die Seite eingespritzt wird, einen Eintrag in der Datenbank zu machen. Sie sind ein ausgezeichnetes Werkzeug, um zu lernen, zu verwenden.

+0

Wir haben keine Modelle in Django .. Ich erwähnte, dass wir DB über Web-Services verwalten .. !! –

+0

Warum würden Sie Django verwenden, aber keine Modelle verwenden? – kcunning

+0

Django ist ein 'web framework'..i knw Modelle ist eine starke Eigenschaft von Django, aber nicht zwingend .. !! –

1

Für eine Audit-Tabelle in der DB selbst, haben einen Blick auf den PL/pgSQL Trigger Audit Example

jede INSERT, UPDATE Dieser protokolliert, in einer anderen Tabelle löschen.

+0

danke..ich werde hineinschauen und gucken ob es was Gutes tut .. !! –

-1

Ich benutzte django-audit-log und ich bin sehr zufrieden.

Django-Audit-Protokoll kann mehrere Modelle in jeder eigenen zusätzlichen Tabelle verfolgen. Alle diese Tabellen sind ziemlich einheitlich, so dass es ziemlich einfach sein sollte, eine SQL-Ansicht zu erstellen, die Daten für alle Modelle anzeigt.

Hier ist, was ich habe ein einziges Modell zu verfolgen getan („Pauza“):

class Pauza(models.Model): 
    started  = models.TimeField(null=True, blank=False) 
    ended  = models.TimeField(null=True, blank=True) 
    #... more fields ... 

    audit_log = AuditLog() 

Wenn Sie Änderungen in Django Admin zeigen wollen, können Sie eine unmanaged model erstellen (aber dies ist kein erforderlichen Mittel):

class PauzaAction(models.Model): 

    started  = models.TimeField(null=True, blank=True) 
    ended  = models.TimeField(null=True, blank=True) 
    #... more fields ... 

    # fields added by Audit Trail: 
    action_id = models.PositiveIntegerField(primary_key=True, default=1, blank=True) 
    action_user = models.ForeignKey(User, null=True, blank=True) 
    action_date = models.DateTimeField(null=True, blank=True) 
    action_type = models.CharField(max_length=31, choices=(('I', 'create'), ('U', 'update'), ('D', 'delete'),), null=True, blank=True) 
    pauza  = models.ForeignKey(Pauza, db_column='id', on_delete=models.DO_NOTHING, default=0, null=True, blank=True) 

    class Meta: 
     db_table = 'testapp_pauzaauditlogentry' 
     managed = False 
     app_label = 'testapp' 

Tabelle testapp_pauzaauditlogentry wird automatisch durch django-Audit-Log erstellt, schafft dies lediglich ein Modell für die Daten von ihr angezeigt werden. Es kann eine gute Idee sein, in einigen rohen Manipulationsschutz zu werfen:

class PauzaAction(models.Model): 

    # ... all like above, plus: 

    def save(self, *args, **kwargs): 
     raise Exception('Permission Denied') 
    def delete(self, *args, **kwargs): 
     raise Exception('Permission Denied') 

Wie gesagt, ich denke, Sie eine SQL-Ansicht mit den vier action_ Felder erzeugen könnten und ein zusätzliches ‚action_model‘ Feld, das varchar enthalten könnte Verweise auf Modell selbst (vielleicht nur der ursprüngliche Tabellenname).

+0

Ich benutze keine Django-Modelle..siehe meinen Kommentar in anderen Antworten .. !! –

Verwandte Themen