def process_response(self, request, response): if request.user.is_authenticated: conn = get_redis_connection('online_user') last_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) request_ip = get_request_ip(request) # redis + django orm 实现在线用户监测 if conn.exists(f'online_user_{request.user.id}_{request_ip}'): conn.hset(f'online_user_{request.user.id}_{request_ip}', 'last_time', last_time) else: online_info = { 'ip': request_ip, 'browser': get_request_browser(request), 'os': get_request_os(request), 'last_time': last_time } conn.hmset(f'online_user_{request.user.id}_{request_ip}', online_info) if not OnlineUsers.objects.filter(user=request.user, ip=request_ip).exists(): OnlineUsers.objects.create(**{ 'user': request.user, 'ip': request_ip }) # key过期后, 使用redis空间通知, 使用户下线 conn.expire(f'online_user_{request.user.id}_{request_ip}', 10 * 60) return response
def process_request(self, request): request_ip = get_request_ip(request) # 在redis中判断IP是否在IP黑名单中/ conn = get_redis_connection('user_info') if conn.sismember('ip_black_list', request_ip): from django.http import HttpResponse return HttpResponse('IP已被拉入黑名单, 请联系管理员', status=status.HTTP_400_BAD_REQUEST)
def __call__(self, request): try: request_body = json.loads(request.body) except Exception: request_body = dict() if request.method == "GET": request_body.update(dict(request.GET)) logger = self.query_logger else: request_body.update(dict(request.POST)) logger = self.operation_logger # 处理密码, log中密码已******替代真实密码 for key in request_body: if 'password' in key: request_body[key] = '******' response = self.get_response(request) try: response_body = response.data # 处理token, log中token已******替代真实token值 if response_body['data'].get('token'): response_body['data']['token'] = '******' except Exception: response_body = dict() request_ip = get_request_ip(request) log_info = f'[{request.user}@{request_ip} [Request: {request.method} {request.path} {request_body}] ' \ f'[Response: {response.status_code} {response.reason_phrase} {response_body}]]' if response.status_code >= 500: logger.error(log_info) elif response.status_code >= 400: logger.warning(log_info) else: logger.info(log_info) return response
def write_error_logs(exc, context, detail): """ 记录错误日志信息 :param exc: 异常 :param context: 抛出异常的上下文 :param detail: 异常详情 :return: """ data = { 'username': context['request'].user.username if context['request'].user.username else 'AnonymousUser', 'view': context['view'].get_view_name(), 'desc': exc.__str__(), 'ip': get_request_ip(context['request']), 'detail': detail } ErrorLogs.objects.create(**data)
def process_response(self, request, response): if request.user.is_authenticated: conn = get_redis_connection('online_user') last_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) if conn.exists(f'online_user_{request.user.id}'): conn.hset(f'online_user_{request.user.id}', 'last_time', last_time) else: online_info = { 'ip': get_request_ip(request), 'browser': get_request_browser(request), 'os': get_request_os(request), 'last_time': last_time } conn.hmset(f'online_user_{request.user.id}', online_info) conn.expire(f'online_user_{request.user.id}', 60 * 10) return response