Как сохранить все пользовательские активности на сайте?

У меня есть встроенное веб-приложение Django + Python которые взаимодействуют с веб-сервисами (написано на JAVA).

Теперь вся часть управления базой данных выполняется веб-сервисами, т.е. все операции CRUD с реальной базой данных выполняются веб-сервисами.


Теперь мне нужно отследить все действия пользователя, выполненные на моем сайте, в некоторой таблице журнала.

Например, если пользователь опубликовал новую статью, то новая строка создается в таблице "Статьи " веб-службами и рядом, мне нужно добавить новую строку в таблицу журнала, что-то вроде "Пользователь: Раман опубликовал новую статью (с ID, название и т. Д.)

Я должен сделать это для всех объектов в моей базе данных, таких как "Статья", "Медиа", "Комментарии" и т. Д.


Примечание: я использую PostgreSQL


Так что это лучший способ достичь этого..?? (Должен ли я сделать это в PostgreSQL ИЛИ JAVA..??.. И как..??)

5 ответов

Решение

Так что у тебя есть UI <-> Web Services <-> DB

Поскольку веб-сервисы взаимодействуют с БД, а веб-сервисы содержат бизнес-логику (то есть, я полагаю, вы проверяете вещи там, создаете свои запросы и выполняете их), тогда лучшее место для "регистрации" действий - это сами сервисы.

IMO, регистрация транзакций PostgreSQL - это совсем другое. Это больше не то же самое, что запись действий пользователя.

РЕДАКТИРОВАТЬ: Это по-прежнему означает, что вы создаете схему БД для "журналов" и записываете их в БД.

Второе РЕДАКТИРОВАНИЕ: отлов событий, достойных журналов, в пользовательском интерфейсе, а затем запись их оттуда также может быть не лучшей идеей. Вам придется переписать протоколирование, если вы когда-нибудь решите заменить пользовательский интерфейс или, например, написать альтернативный пользовательский интерфейс, скажем, для мобильных устройств или что-то еще.

Для таблицы аудита в самой БД, посмотрите на Пример аудита триггера PL/pgSQL

Это регистрирует каждую INSERT, UPDATE, DELETE в другую таблицу.

В вашей таблице журнала вы можете иметь различные столбцы, в том числе:

  • user_id (пользователь, который сделал действие)
  • activity_type (вид деятельности, такой как view или же commented_on)
  • object_id (фактический объект, к которому это относится, например, статья или СМИ)
  • object_type (тип объекта; это может быть использовано позже, в сочетании с object_id искать объект в базе данных)

Таким образом, вы можете отслеживать все действия пользователей. Вам нужно будет обновлять эту таблицу всякий раз, когда происходит что-то, что вы хотите отслеживать.

Всякий раз, когда нам приходилось это делать, мы перекрывали сигналы для каждой модели и возможных действий.

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

Вы можете сделать так, чтобы сигнал делал все, что угодно, от введения HTML-кода на страницу до внесения записи в базу данных. Это отличный инструмент для обучения.

Я использовал django-audit-log, и я очень доволен.

Django-audit-log может отслеживать несколько моделей, каждая из которых находится в отдельной дополнительной таблице. Все эти таблицы довольно унифицированы, поэтому должно быть довольно просто создать представление SQL, которое показывает данные для всех моделей.

Вот что я сделал, чтобы отследить одну модель ("Pauza"):

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

    audit_log = AuditLog() 

Если вы хотите, чтобы изменения отображались в Django Admin, вы можете создать неуправляемую модель (но это ни в коем случае не требуется):

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'

Таблица testapp_pauzaauditlogentry автоматически создается django-audit-log, это просто создает модель для отображения данных из него. Это может быть хорошей идеей добавить грубую защиту от несанкционированного доступа:

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')

Как я уже сказал, я думаю, вы могли бы создать представление SQL с четырьмя action_ поля и дополнительное поле 'action_model', которое может содержать ссылки varchar на саму модель (может быть, просто оригинальное имя таблицы).

Другие вопросы по тегам