在我的网站中,我正在跟踪用户所做的任何操作,一页一页地查看页面。
在某些视图中,我会执行一些ajax请求,例如:
def books_list(request):
books_list = Book.objects.filter(published=True).order_by('-timestamp')
if request.method == 'POST' and request.is_ajax():
id_book = request.POST.get('id_book')
try:
book = books_list.get(id=id_book)
book.delete()
except Book.DoesNotExist:
return JsonResponse({'error':True,'msg':'Book not found'})
render(request,'book/books-list.html',context={'books_list':books_list})
这里是它的外观的快速视图:
*# analytics *
- / # the home page
- /books/ # visits list of books
- /books/ # He deletes a book
- /books/ # back to list of books
如您所见,当用户删除一本书时,跟踪显然会保持相同的URL /books/
,我该如何使用它:
*# analytics *
- / # the home page
- /books/ # visits list of books
- /books/delete # He deletes a book
- /books/ # back to list of books
我需要为简单的删除操作创建新的 view / url 吗?
答案 0 :(得分:1)
您可以通过两种方式记录用户的活动 它基于跟踪的目的,是仅用于记录日志,还是将其存储在您的数据库中,但是第一个也可以解析为数据库(no_sql)或(sql) 您可以根据业务需求和项目需求来获得此抽象答案并对其进行优化
第一种方式
from .utils import get_client_ip
DELETED_FILES_LOGGER = logging.getLogger("deleted_files")
def books_list(request):
books_list = Book.objects.filter(published=True).order_by('-timestamp')
if request.method == 'POST' and request.is_ajax():
id_book = request.POST.get('id_book')
try:
book = books_list.get(id=id_book)
book.delete()
DELETED_FILES_LOGGER.debug(
'DELETION: %s by %s at %s from IP Address %s' % (
book.filename(), request.user,
datetime.datetime.now(), get_client_ip(request)))
except Book.DoesNotExist:
return JsonResponse({'error':True,'msg':'Book not found'})
render(request,'book/books-list.html',context={'books_list':books_list})
def get_client_ip(request):
"""
to get client ip request
:param request:
:return: ip <str>
"""
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
第二种方式
from django.contrib.admin.models import LogEntry as AbstractLogEntry
class LogEntry(AbstractLogEntry):
class Meta:
proxy = True
app_label = 'data'
verbose_name_plural = 'Log Entries'
permissions = (("add_log", "add log entry"),
("delete_log", "delete log entry"),
("change_log", "change log entry"),
)
def __str__(self):
if self.action_flag == 5:
return ugettext('Download "%(object)s."') % {'object': self.object_repr}
if self.action_flag == 4:
return ugettext('Uploaded "%(object)s."') % {'object': self.object_repr}
elif self.is_addition():
return ugettext('Added "%(object)s".') % {'object': self.object_repr}
elif self.is_change():
return ugettext('Changed "%(object)s" - %(changes)s') % {
'object': self.object_repr,
'changes': self.change_message,
}
elif self.is_deletion():
return ugettext('Deleted "%(object)s."') % {'object': self.object_repr}
def books_list(request):
books_list = Book.objects.filter(published=True).order_by('-timestamp')
if request.method == 'POST' and request.is_ajax():
id_book = request.POST.get('id_book')
try:
book = books_list.get(id=id_book)
book.delete()
LogEntry.objects.log_action(user_id=request.user.id,
change_message='Upload %s for category %s' % (
book.filename(), book.category),
content_type_id=ContentType.objects.get(model__exact='book').id,
object_id=book.id,
object_repr=request.user.username,
action_flag=4
)
except Book.DoesNotExist:
return JsonResponse({'error':True,'msg':'Book not found'})
render(request,'book/books-list.html',context={'books_list':books_list})
您还可以在管理器本身上添加日志记录
class BookManager(models.Manager):
def delete(self):
# you logging as mentioned above
super(BookManager).delete()
class Book(models.Model):
.....
....
objects = BookManager()