Как сохранить все пользовательские активности на сайте?
У меня есть встроенное веб-приложение 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 на саму модель (может быть, просто оригинальное имя таблицы).