登录日志后端完成

pull/2/head
李强 2021-03-16 00:32:54 +08:00
parent 5fbaa97cad
commit 89160db78b
6 changed files with 109 additions and 7 deletions

View File

@ -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

View File

@ -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}"

View File

@ -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}"

View File

@ -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)

View File

@ -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 ""

View File

@ -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