登录日志后端完成
parent
5fbaa97cad
commit
89160db78b
|
@ -5,4 +5,5 @@ from ..models.web_set import WebSet
|
||||||
from ..models.save_file import SaveFile
|
from ..models.save_file import SaveFile
|
||||||
from ..models.message_push import MessagePush
|
from ..models.message_push import MessagePush
|
||||||
from ..models.message_push import MessagePushUser
|
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 .exceptions import GenException
|
||||||
from .jwt_util import jwt_get_session_id
|
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 .response import SuccessResponse, ErrorResponse
|
||||||
|
|
||||||
# from .jwt_util import jwt_response_payload_handler
|
# from .jwt_util import jwt_response_payload_handler
|
||||||
|
from ..system.models.logininfor import LoginInfor
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -61,6 +62,18 @@ class LoginView(ObtainJSONWebToken):
|
||||||
else:
|
else:
|
||||||
raise GenException(message='验证码错误')
|
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):
|
def post(self, request, *args, **kwargs):
|
||||||
# 校验验证码
|
# 校验验证码
|
||||||
self.jarge_captcha(request)
|
self.jarge_captcha(request)
|
||||||
|
@ -75,6 +88,7 @@ class LoginView(ObtainJSONWebToken):
|
||||||
session_id = jwt_get_session_id(token)
|
session_id = jwt_get_session_id(token)
|
||||||
key = f"{self.prefix}_{session_id}_{username}"
|
key = f"{self.prefix}_{session_id}_{username}"
|
||||||
cache.set(key, token, self.ex.total_seconds())
|
cache.set(key, token, self.ex.total_seconds())
|
||||||
|
self.save_login_infor(request, '登录成功')
|
||||||
if self.JWT_AUTH_COOKIE and token:
|
if self.JWT_AUTH_COOKIE and token:
|
||||||
expiration = (datetime.datetime.utcnow() + self.ex)
|
expiration = (datetime.datetime.utcnow() + self.ex)
|
||||||
response.set_cookie(self.JWT_AUTH_COOKIE,
|
response.set_cookie(self.JWT_AUTH_COOKIE,
|
||||||
|
@ -83,8 +97,9 @@ class LoginView(ObtainJSONWebToken):
|
||||||
domain=settings.SESSION_COOKIE_DOMAIN,
|
domain=settings.SESSION_COOKIE_DOMAIN,
|
||||||
httponly=False)
|
httponly=False)
|
||||||
return response
|
return response
|
||||||
|
self.save_login_infor(request, '登录失败,账户/密码不正确',False)
|
||||||
return ErrorResponse(data=serializer.errors, msg='账户/密码不正确')
|
return ErrorResponse(data=serializer.errors, msg='账户/密码不正确')
|
||||||
|
|
||||||
def handle_exception(self, exc):
|
# def handle_exception(self, exc):
|
||||||
print(exc)
|
# print(exc)
|
||||||
return ErrorResponse(data=None, msg=exc.message)
|
# return ErrorResponse(data=None, msg=exc.message)
|
||||||
|
|
|
@ -3,12 +3,13 @@ Request工具类
|
||||||
"""
|
"""
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from django.contrib.auth.models import AbstractBaseUser
|
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.contrib.auth.models import AnonymousUser
|
||||||
from django.urls.resolvers import ResolverMatch
|
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__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -126,3 +127,48 @@ def get_request_canonical_path(request, *args, **kwargs):
|
||||||
if key == 'pk':
|
if key == 'pk':
|
||||||
pass
|
pass
|
||||||
return path
|
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
|
sqlparse==0.4.1
|
||||||
xlwt==1.3.0
|
xlwt==1.3.0
|
||||||
coreapi==2.3.3
|
coreapi==2.3.3
|
||||||
|
user-agents==2.2.0
|
||||||
|
eventlet==0.30.2
|
||||||
|
|
Loading…
Reference in New Issue