登录日志后端完成
							parent
							
								
									5fbaa97cad
								
							
						
					
					
						commit
						89160db78b
					
				|  | @ -5,4 +5,5 @@ from ..models.web_set import WebSet | |||
| from ..models.save_file import SaveFile | ||||
| from ..models.message_push import MessagePush | ||||
| from ..models.message_push import MessagePushUser | ||||
| from ..models.logininfor import LoginInfor | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,19 @@ | |||
| from django.db.models import CharField, BooleanField | ||||
| 
 | ||||
| from ...op_drf.models import CoreModel | ||||
| 
 | ||||
| 
 | ||||
| class LoginInfor(CoreModel): | ||||
|     browser = CharField(max_length=64, verbose_name="浏览器") | ||||
|     ipaddr = CharField(max_length=32, verbose_name="ip地址", null=True, blank=True) | ||||
|     loginLocation = CharField(max_length=64, verbose_name="登录位置", null=True, blank=True) | ||||
|     msg = CharField(max_length=64, verbose_name="操作信息", null=True, blank=True) | ||||
|     os = CharField(max_length=64, verbose_name="操作系统", null=True, blank=True) | ||||
|     status = BooleanField(default=False, verbose_name="登录状态") | ||||
| 
 | ||||
|     class Meta: | ||||
|         verbose_name = '登录日志' | ||||
|         verbose_name_plural = verbose_name | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return f"{self.creator and self.creator.name}" | ||||
|  | @ -0,0 +1,19 @@ | |||
| from django.db.models import TextField, CharField | ||||
| 
 | ||||
| from ...op_drf.models import CoreModel | ||||
| 
 | ||||
| 
 | ||||
| class WebSet(CoreModel): | ||||
|     name = CharField(max_length=64, verbose_name="站点名称") | ||||
|     web_site = CharField(max_length=256, verbose_name="站点网址", null=True, blank=True) | ||||
|     logo = CharField(max_length=256, verbose_name="网站Logo", null=True, blank=True) | ||||
|     record_info = TextField(verbose_name="备案信息", null=True, blank=True) | ||||
|     statistics_code = TextField(verbose_name="统计代码", null=True, blank=True) | ||||
|     copyright_info = TextField(verbose_name="版权信息", null=True, blank=True) | ||||
| 
 | ||||
|     class Meta: | ||||
|         verbose_name = '操作日志' | ||||
|         verbose_name_plural = verbose_name | ||||
| 
 | ||||
|     def __str__(self): | ||||
|         return f"{self.name}" | ||||
|  | @ -12,9 +12,10 @@ from rest_framework_jwt.views import ObtainJSONWebToken, jwt_response_payload_ha | |||
| 
 | ||||
| from .exceptions import GenException | ||||
| from .jwt_util import jwt_get_session_id | ||||
| from .request_util import get_request_ip, get_os, get_browser, get_login_location | ||||
| from .response import SuccessResponse, ErrorResponse | ||||
| 
 | ||||
| # from .jwt_util import jwt_response_payload_handler | ||||
| from ..system.models.logininfor import LoginInfor | ||||
| 
 | ||||
| logger = logging.getLogger(__name__) | ||||
| 
 | ||||
|  | @ -61,6 +62,18 @@ class LoginView(ObtainJSONWebToken): | |||
|         else: | ||||
|             raise GenException(message='验证码错误') | ||||
| 
 | ||||
|     def save_login_infor(self, request, msg='',status=True): | ||||
|         User = get_user_model() | ||||
|         instance = LoginInfor() | ||||
|         instance.browser = get_browser(request) | ||||
|         instance.ipaddr = get_request_ip(request) | ||||
|         instance.loginLocation = get_login_location(request) | ||||
|         instance.msg = msg | ||||
|         instance.os = get_os(request) | ||||
|         instance.status = status | ||||
|         instance.creator = request.user and User.objects.filter(username=request.data.get('username')).first() | ||||
|         instance.save() | ||||
| 
 | ||||
|     def post(self, request, *args, **kwargs): | ||||
|         # 校验验证码 | ||||
|         self.jarge_captcha(request) | ||||
|  | @ -75,6 +88,7 @@ class LoginView(ObtainJSONWebToken): | |||
|                 session_id = jwt_get_session_id(token) | ||||
|                 key = f"{self.prefix}_{session_id}_{username}" | ||||
|                 cache.set(key, token, self.ex.total_seconds()) | ||||
|                 self.save_login_infor(request, '登录成功') | ||||
|             if self.JWT_AUTH_COOKIE and token: | ||||
|                 expiration = (datetime.datetime.utcnow() + self.ex) | ||||
|                 response.set_cookie(self.JWT_AUTH_COOKIE, | ||||
|  | @ -83,8 +97,9 @@ class LoginView(ObtainJSONWebToken): | |||
|                                     domain=settings.SESSION_COOKIE_DOMAIN, | ||||
|                                     httponly=False) | ||||
|             return response | ||||
|         self.save_login_infor(request, '登录失败,账户/密码不正确',False) | ||||
|         return ErrorResponse(data=serializer.errors, msg='账户/密码不正确') | ||||
| 
 | ||||
|     def handle_exception(self, exc): | ||||
|         print(exc) | ||||
|         return ErrorResponse(data=None, msg=exc.message) | ||||
|     # def handle_exception(self, exc): | ||||
|     #     print(exc) | ||||
|     #     return ErrorResponse(data=None, msg=exc.message) | ||||
|  |  | |||
|  | @ -3,12 +3,13 @@ Request工具类 | |||
| """ | ||||
| import json | ||||
| import logging | ||||
| 
 | ||||
| from django.contrib.auth.models import AbstractBaseUser | ||||
| from rest_framework.authentication import BaseAuthentication | ||||
| from rest_framework.settings import api_settings as drf_settings | ||||
| from django.contrib.auth.models import AnonymousUser | ||||
| from django.urls.resolvers import ResolverMatch | ||||
| 
 | ||||
| from rest_framework.authentication import BaseAuthentication | ||||
| from rest_framework.settings import api_settings as drf_settings | ||||
| from user_agents import parse | ||||
| 
 | ||||
| logger = logging.getLogger(__name__) | ||||
| 
 | ||||
|  | @ -126,3 +127,48 @@ def get_request_canonical_path(request, *args, **kwargs): | |||
|         if key == 'pk': | ||||
|             pass | ||||
|     return path | ||||
| 
 | ||||
| 
 | ||||
| def get_browser(request, *args, **kwargs): | ||||
|     """ | ||||
|     获取浏览器名 | ||||
|     :param request: | ||||
|     :param args: | ||||
|     :param kwargs: | ||||
|     :return: | ||||
|     """ | ||||
|     ua_string = request.META['HTTP_USER_AGENT'] | ||||
|     user_agent = parse(ua_string) | ||||
|     return user_agent.get_browser() | ||||
| 
 | ||||
| 
 | ||||
| def get_os(request, *args, **kwargs): | ||||
|     """ | ||||
|     获取操作系统 | ||||
|     :param request: | ||||
|     :param args: | ||||
|     :param kwargs: | ||||
|     :return: | ||||
|     """ | ||||
|     ua_string = request.META['HTTP_USER_AGENT'] | ||||
|     user_agent = parse(ua_string) | ||||
|     return user_agent.get_os() | ||||
| 
 | ||||
| 
 | ||||
| def get_login_location(request, *args, **kwargs): | ||||
|     """ | ||||
|     获取ip 登录位置 | ||||
|     :param request: | ||||
|     :param args: | ||||
|     :param kwargs: | ||||
|     :return: | ||||
|     """ | ||||
|     import requests | ||||
|     import eventlet  # 导入eventlet这个模块 | ||||
|     eventlet.monkey_patch(thread=False)  # 必须加这条代码 | ||||
|     with eventlet.Timeout(2, False):  # 设置超时时间为2秒 | ||||
|         apiurl = "http://whois.pconline.com.cn/ip.jsp?ip=%s" % get_request_ip(request) | ||||
|         r = requests.get(apiurl) | ||||
|         content = r.content.decode('GBK') | ||||
|         return content.replace('\r', '').replace('\n', '') | ||||
|     return "" | ||||
|  |  | |||
|  | @ -21,3 +21,5 @@ six==1.15.0 | |||
| sqlparse==0.4.1 | ||||
| xlwt==1.3.0 | ||||
| coreapi==2.3.3 | ||||
| user-agents==2.2.0 | ||||
| eventlet==0.30.2 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 李强
						李强