# -*- coding: utf-8 -*- """ @File : request_util.py @Time : 2024/1/15 10:15 @Author : geekbing @LastEditTime : - @LastEditors : - @Description : Request工具类 """ import logging from typing import Dict import requests from django.conf import settings from user_agents import parse from lunarlink.models import LoginLog logger = logging.getLogger(__name__) def get_request_ip(request): """ 获取请求IP :param request: :return: """ x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR", "") if x_forwarded_for: # X-Forwarded-For 可能有一个代理链,因此这里取第一个即客户端的真实 IP ip = x_forwarded_for.split(",")[0].strip() return ip ip = request.META.get("REMOTE_ADDR", "") or getattr(request, "request_ip", None) return ip or "unknown" def get_ip_analysis(ip) -> Dict: """ 获取IP解析数据 :param ip: ip地址 :return: """ data = { "continent": "", "country": "", "province": "", "city": "", "district": "", "isp": "", "area_code": "", "country_english": "", "country_code": "", "longitude": "", "latitude": "", } if ip != "unknown" and ip: if getattr(settings, "ENABLE_LOGIN_ANALYSIS_LOG", True): # url = f"https://ip-api.com/json/{ip}?lang=zh-CN" try: res = requests.get( url="https://ip.django-vue-admin.com/ip/analysis", params={"ip": ip}, timeout=5, ) if res.status_code == 200: res_data = res.json() if res_data.get("code") == 0: data = res_data.get("data") except Exception as e: logger.error(e) return data def get_browser(request): """ 获取浏览器 :param request: :return: """ ua_string = request.META["HTTP_USER_AGENT"] user_agent = parse(ua_string) return user_agent.get_browser() def get_os(request): """ 获取操作系统 :param request: :return: """ ua_string = request.META["HTTP_USER_AGENT"] user_agent = parse(ua_string) return user_agent.get_os() def save_login_log(request): """ 保存登录日志 :param request: 请求对象 :return: """ ip = get_request_ip(request=request) # 过滤掉平台自身的服务器 IP 地址 platform_ips = ["127.0.0.1", "47.119.28.171"] # 如果请求来自平台自身的 IP,跳过记录日志 if ip in platform_ips: return analysis_data = get_ip_analysis(ip=ip) analysis_data.update( { "ip": ip, "username": request.user.username, "name": request.user.name, "agent": str(parse(request.META.get("HTTP_USER_AGENT", ""))), "browser": get_browser(request=request), "os": get_os(request=request), "creator_id": request.user.id, } ) LoginLog.objects.create(**analysis_data)