def get(self, request, *args, **kwargs): if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] self.cur_user_ip = ip alias = self.kwargs.get('slug') visited_ips = cache.get(alias, []) if ip not in visited_ips: try: post = self.queryset.get(alias=alias) except Post.DoesNotExist: logger.error(u'访问不存在的文章:[%s]' % alias) context = super(PostDetailView, self).get_context_data(**kwargs) return render(request, '404.html', context) else: post.view_times += 1 post.save() visited_ips.append(ip) self.set_lru_read(ip, post) cache.set(alias, visited_ips, FIF_MIN) cache.set("postCategory_"+alias, post.category.alias, FIF_MIN) self.curCategory = post.category.alias else: self.curCategory = cache.get("postCategory_"+alias) return super(PostDetailView, self).get(request, *args, **kwargs)
def set_lru_read(self, ip, post): #保存别人正在读 lru_views = cache.get('lru_views') if not lru_views: lru_views = LRUCacheDict(max_size=10, expiration=FIF_MIN) if post not in lru_views.values(): lru_views[ip] = post cache.set('lru_views', lru_views, FIF_MIN)
def process_view(self, request, view_func, view_args, view_kwargs): """ 处理当前在线人数 """ http_user_agent = request.META.get("HTTP_USER_AGENT") if "Spider" in http_user_agent or "spider" in http_user_agent: return if "HTTP_X_FORWARDED_FOR" in request.META: ip = request.META["HTTP_X_FORWARDED_FOR"] else: ip = request.META["REMOTE_ADDR"] online_ips = cache.get("online_ips", []) if online_ips: online_ips = cache.get_many(online_ips).keys() cache.set(ip, 0, 5 * 60) if ip not in online_ips: online_ips.append(ip) cache.set("online_ips", online_ips)