您现在的位置是: 网站首页 >Django Django
装饰器应用,之使用装饰器记录博客访问日志
admin2019年1月3日 16:59 【Django | Python 】 1021人已围观
# 使用装饰器记录博客访问日志 需要对访问进行记录 ## 获取访问request信息 ```python def get_request_ip(request): if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] print('当前访问路径:', request.get_raw_uri(), '用户IP:', ip) return ip def get_request_agent(request): agent = request.META.get('HTTP_USER_AGENT', '') print('设备信息:', agent) return agent def get_request_uri(request): # uri = request.build_absolute_uri() # http://ip or domain/blog/1/detail/ uri = '{}{}://{}{}'.format(request.scheme, 's' if request.is_secure() else '', request.get_host(), request.get_full_path()) return uri ``` ## 在视图中创建访问记录 ```python class IndexView(View): show_index = True def get(self, request, **kwargs): # 访问写入日志 if get_request_ip(request) != '127.0.0.1': BlogRequestLog.objects.create(ip=get_request_ip(request), user_agent=get_request_agent(request), absolute_uri=get_request_uri(request)) # ...... ``` 所以在每个视图都需要这样加一串代码 ## 使用装饰器创建访问记录 ### 创建装饰器 ```python # 记录博客访问到日志的装饰器 def record_visit_blog_info(func): def decorator(request, *args, **kwargs): # 访问写入日志 print('博客视图中,装饰器记录博客访问日志') if get_request_ip(request) != '127.0.0.1': ip = get_request_ip(request) user_agent = get_request_agent(request) absolute_uri = get_request_uri(request) # 记录日志 BlogRequestLog.objects.create(ip=ip, user_agent=user_agent, absolute_uri=absolute_uri) return func(request, *args, **kwargs) return decorator ``` ### 装饰视图 装饰基于类的视图 ```python from django.utils.decorators import method_decorator @method_decorator(record_visit_blog_info, name='dispatch') class IndexView(View): show_index = True def get(self, request, **kwargs): # ...... ``` 装饰函数视图 ```python @record_visit_blog_info def my_func(request): # ...... ``` 在不改动旧的代码的情况下对访问进行统计,装饰器是一个简洁高效的办法。代码逻辑很简单。
很赞哦! (0)