新功能(dvadmin): 可配置取消redis,文件上传问题修复

pull/36/head
李强 2021-07-03 17:10:31 +08:00
parent e17e5cc513
commit a56e064924
9 changed files with 58 additions and 26 deletions

View File

@ -1,6 +1,7 @@
from django.core.cache import cache from django.core.cache import cache
from django.db.models import IntegerField, ForeignKey, CharField, CASCADE, Q from django.db.models import IntegerField, ForeignKey, CharField, CASCADE, Q
from application import settings
from apps.vadmin.op_drf.models import CoreModel from apps.vadmin.op_drf.models import CoreModel
@ -42,7 +43,8 @@ class Menu(CoreModel):
:return: :return:
""" """
try: try:
interface_dict = cache.get('permission_interface_dict', {}) interface_dict = cache.get('permission_interface_dict', {}) if getattr(settings, "REDIS_ENABLE",
False) else {}
except: except:
interface_dict = {} interface_dict = {}
if not interface_dict: if not interface_dict:
@ -52,7 +54,8 @@ class Menu(CoreModel):
interface_dict[ele.get('interface_method', '')].append(ele.get('interface_path')) interface_dict[ele.get('interface_method', '')].append(ele.get('interface_path'))
else: else:
interface_dict[ele.get('interface_method', '')] = [ele.get('interface_path')] interface_dict[ele.get('interface_method', '')] = [ele.get('interface_path')]
cache.set('permission_interface_dict', interface_dict, 84600) if getattr(settings, "REDIS_ENABLE", False):
cache.set('permission_interface_dict', interface_dict, 84600)
return interface_dict return interface_dict
@classmethod @classmethod
@ -61,7 +64,8 @@ class Menu(CoreModel):
清空缓存中的接口列表 清空缓存中的接口列表
:return: :return:
""" """
cache.delete('permission_interface_dict') if getattr(settings, "REDIS_ENABLE", False):
cache.delete('permission_interface_dict')
class Meta: class Meta:
verbose_name = '菜单管理' verbose_name = '菜单管理'

View File

@ -30,7 +30,8 @@ class UserProfile(AbstractUser, CoreModel):
@property @property
def get_user_interface_dict(self): def get_user_interface_dict(self):
interface_dict = cache.get(f'permission_interface_dict_{self.username}', {}) interface_dict = cache.get(f'permission_interface_dict_{self.username}', {}) if \
getattr(settings, "REDIS_ENABLE", False) else {}
if not interface_dict: if not interface_dict:
for ele in self.role.filter(status='1', menu__status='1').values('menu__interface_path', for ele in self.role.filter(status='1', menu__status='1').values('menu__interface_path',
'menu__interface_method').distinct(): 'menu__interface_method').distinct():
@ -41,7 +42,8 @@ class UserProfile(AbstractUser, CoreModel):
interface_dict[ele.get('menu__interface_method', '')].append(interface_path) interface_dict[ele.get('menu__interface_method', '')].append(interface_path)
else: else:
interface_dict[ele.get('menu__interface_method', '')] = [interface_path] interface_dict[ele.get('menu__interface_method', '')] = [interface_path]
cache.set(f'permission_interface_dict_{self.username}', interface_dict, 84600) if getattr(settings, "REDIS_ENABLE", False):
cache.set(f'permission_interface_dict_{self.username}', interface_dict, 84600)
return interface_dict return interface_dict
@property @property
@ -50,6 +52,7 @@ class UserProfile(AbstractUser, CoreModel):
清空缓存中的接口列表 清空缓存中的接口列表
:return: :return:
""" """
if not getattr(settings, "REDIS_ENABLE", False): return ""
return cache.delete(f'permission_interface_dict_{self.username}') return cache.delete(f'permission_interface_dict_{self.username}')
class Meta: class Meta:

View File

@ -1,6 +1,7 @@
from django.core.cache import cache from django.core.cache import cache
from rest_framework import serializers from rest_framework import serializers
from application import settings
from apps.vadmin.op_drf.serializers import CustomModelSerializer from apps.vadmin.op_drf.serializers import CustomModelSerializer
from apps.vadmin.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush, MessagePushUser from apps.vadmin.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush, MessagePushUser
from apps.vadmin.system.models import LoginInfor, OperationLog, CeleryLog from apps.vadmin.system.models import LoginInfor, OperationLog, CeleryLog
@ -81,7 +82,8 @@ class DictDetailsCreateUpdateSerializer(CustomModelSerializer):
""" """
def save(self, **kwargs): def save(self, **kwargs):
cache.delete('system_dict_details') if getattr(settings, "REDIS_ENABLE", False):
cache.delete('system_dict_details')
return super().save(**kwargs) return super().save(**kwargs)
class Meta: class Meta:
@ -120,7 +122,8 @@ class ConfigSettingsCreateUpdateSerializer(CustomModelSerializer):
""" """
def save(self, **kwargs): def save(self, **kwargs):
cache.delete('system_configKey') if getattr(settings, "REDIS_ENABLE", False):
cache.delete('system_configKey')
return super().save(**kwargs) return super().save(**kwargs)
class Meta: class Meta:
@ -147,7 +150,10 @@ class SaveFileCreateUpdateSerializer(CustomModelSerializer):
""" """
文件管理 创建/更新时的列化器 文件管理 创建/更新时的列化器
""" """
file_url = serializers.CharField(source='file.url', read_only=True) file_url = serializers.SerializerMethodField(read_only=True)
def get_file_url(self, obj: SaveFile):
return getattr(obj.file, "url", obj.file) if hasattr(obj, "file") else ""
def save(self, **kwargs): def save(self, **kwargs):
files = self.context.get('request').FILES.get('file') files = self.context.get('request').FILES.get('file')

View File

@ -72,7 +72,7 @@ class DictDetailsModelViewSet(CustomModelViewSet):
:param kwargs: :param kwargs:
:return: :return:
""" """
dict_details_dic = cache.get('system_dict_details', {}) dict_details_dic = cache.get('system_dict_details', {}) if getattr(settings, "REDIS_ENABLE", False) else {}
if not dict_details_dic: if not dict_details_dic:
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
queryset_dic = queryset.order_by('sort').values('dict_data__dictType', 'dictLabel', 'dictValue', queryset_dic = queryset.order_by('sort').values('dict_data__dictType', 'dictLabel', 'dictValue',
@ -83,7 +83,8 @@ class DictDetailsModelViewSet(CustomModelViewSet):
dict_details_dic[dictType].append(ele) dict_details_dic[dictType].append(ele)
else: else:
dict_details_dic[dictType] = [ele] dict_details_dic[dictType] = [ele]
cache.set('system_dict_details', dict_details_dic, 84600) if getattr(settings, "REDIS_ENABLE", False):
cache.set('system_dict_details', dict_details_dic, 84600)
return SuccessResponse(dict_details_dic.get(kwargs.get('pk'), [])) return SuccessResponse(dict_details_dic.get(kwargs.get('pk'), []))
def clearCache(self, request: Request, *args, **kwargs): def clearCache(self, request: Request, *args, **kwargs):
@ -94,7 +95,8 @@ class DictDetailsModelViewSet(CustomModelViewSet):
:param kwargs: :param kwargs:
:return: :return:
""" """
cache.delete('system_dict_details') if getattr(settings, "REDIS_ENABLE", False):
cache.delete('system_dict_details')
return SuccessResponse(msg='清理成功!') return SuccessResponse(msg='清理成功!')
def export(self, request: Request, *args, **kwargs): def export(self, request: Request, *args, **kwargs):
@ -137,12 +139,13 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
:param kwargs: :param kwargs:
:return: :return:
""" """
config_key_dic = cache.get('system_configKey') config_key_dic = cache.get('system_configKey') if getattr(settings, "REDIS_ENABLE", False) else ""
if not config_key_dic: if not config_key_dic:
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
config_key_dic = {ele.get('configKey'): ele.get('configValue') for ele in config_key_dic = {ele.get('configKey'): ele.get('configValue') for ele in
queryset.values('configValue', 'configKey')} queryset.values('configValue', 'configKey')}
cache.set('system_configKey', config_key_dic, 84600) if getattr(settings, "REDIS_ENABLE", False):
cache.set('system_configKey', config_key_dic, 84600)
return SuccessResponse(msg=config_key_dic.get(kwargs.get('pk'), '')) return SuccessResponse(msg=config_key_dic.get(kwargs.get('pk'), ''))
def clearCache(self, request: Request, *args, **kwargs): def clearCache(self, request: Request, *args, **kwargs):
@ -153,7 +156,8 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
:param kwargs: :param kwargs:
:return: :return:
""" """
cache.delete('system_configKey') if getattr(settings, "REDIS_ENABLE", False):
cache.delete('system_configKey')
return SuccessResponse(msg='清理成功!') return SuccessResponse(msg='清理成功!')
@ -173,6 +177,13 @@ class SaveFileModelViewSet(CustomModelViewSet):
search_fields = ('configName',) search_fields = ('configName',)
ordering = '-create_datetime' # 默认排序 ordering = '-create_datetime' # 默认排序
def create(self, request: Request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return SuccessResponse(serializer.data, status=201, headers=headers)
def clearsavefile(self, request: Request, *args, **kwargs): def clearsavefile(self, request: Request, *args, **kwargs):
""" """
清理废弃文件 清理废弃文件
@ -185,8 +196,8 @@ class SaveFileModelViewSet(CustomModelViewSet):
file_list = get_all_files(os.path.join(settings.MEDIA_ROOT, 'system')) file_list = get_all_files(os.path.join(settings.MEDIA_ROOT, 'system'))
queryset_files = [os.path.join(os.path.join(settings.MEDIA_ROOT) + os.sep, ele) for ele in queryset_files = [os.path.join(os.path.join(settings.MEDIA_ROOT) + os.sep, ele) for ele in
list(self.get_queryset().values_list('file', flat=True))] list(self.get_queryset().values_list('file', flat=True))]
queryset_files_dir = set(map(lambda absdir: os.path.abspath(absdir), queryset_files))
delete_list = list(set(file_list) - set(queryset_files)) delete_list = list(set(file_list) - queryset_files_dir)
# 进行文件删除操作 # 进行文件删除操作
delete_files(delete_list) delete_files(delete_list)
# 递归删除空文件 # 递归删除空文件

View File

@ -92,7 +92,7 @@ class RedisOpAuthJwtAuthentication(OpAuthJwtAuthentication):
def authenticate(self, request): def authenticate(self, request):
res = super().authenticate(request) res = super().authenticate(request)
if res: if res and getattr(settings, "REDIS_ENABLE", False):
user, token = res user, token = res
session_id = jwt_get_session_id(token) session_id = jwt_get_session_id(token)
key = f"{self.prefix}_{session_id}_{user.username}" key = f"{self.prefix}_{session_id}_{user.username}"

View File

@ -306,7 +306,7 @@ class CacheResponse(object):
is_no_cache = True is_no_cache = True
response = None response = None
if not is_no_cache: if not is_no_cache:
response = self.cache.get(key) response = self.cache.get(key) if getattr(settings, "REDIS_ENABLE", False) else None
if not response: if not response:
response = view_method(view_instance, request, *args, **kwargs) response = view_method(view_instance, request, *args, **kwargs)
response = view_instance.finalize_response(request, response, *args, **kwargs) response = view_instance.finalize_response(request, response, *args, **kwargs)
@ -314,10 +314,11 @@ class CacheResponse(object):
if not response.status_code >= 400 or self.cache_errors: if not response.status_code >= 400 or self.cache_errors:
if not is_no_cache: if not is_no_cache:
if isinstance(response, Response): if getattr(settings, "REDIS_ENABLE", False):
self.cache.set(key, response.data, self.timeout) if isinstance(response, Response):
else: self.cache.set(key, response.data, self.timeout)
self.cache.set(key, response, self.timeout) else:
self.cache.set(key, response, self.timeout)
handle_refresh_cache_fun = getattr(view_instance, 'handle_refresh_cache', None) handle_refresh_cache_fun = getattr(view_instance, 'handle_refresh_cache', None)
if handle_refresh_cache_fun: if handle_refresh_cache_fun:
handle_refresh_cache_fun(request=request, key=key, cache=self.cache) handle_refresh_cache_fun(request=request, key=key, cache=self.cache)

View File

@ -31,7 +31,8 @@ class LogoutView(APIView):
user.user_secret = uuid4() user.user_secret = uuid4()
user.save() user.save()
key = f"{self.prefix}_{user.username}" key = f"{self.prefix}_{user.username}"
cache.delete(key) if getattr(settings, "REDIS_ENABLE", False):
cache.delete(key)
return SuccessResponse() return SuccessResponse()
@ -87,7 +88,8 @@ class LoginView(ObtainJSONWebToken):
username = user.username username = user.username
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()) if getattr(settings, "REDIS_ENABLE", False):
cache.set(key, token, self.ex.total_seconds())
self.save_login_infor(request, '登录成功', session_id=session_id) self.save_login_infor(request, '登录成功', session_id=session_id)
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)

View File

@ -10,6 +10,7 @@ from django.core.cache import cache
from django.urls.resolvers import ResolverMatch from django.urls.resolvers import ResolverMatch
from user_agents import parse from user_agents import parse
from application import settings
from apps.vadmin.utils.authentication import OpAuthJwtAuthentication from apps.vadmin.utils.authentication import OpAuthJwtAuthentication
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -161,11 +162,12 @@ def get_login_location(request, *args, **kwargs):
:param kwargs: :param kwargs:
:return: :return:
""" """
if not getattr(settings, "ENABLE_LOGIN_LOCATION", False): return ""
import requests import requests
import eventlet # 导入eventlet这个模块 import eventlet # 导入eventlet这个模块
request_ip = get_request_ip(request) request_ip = get_request_ip(request)
# 从缓存中获取 # 从缓存中获取
location = cache.get(request_ip) location = cache.get(request_ip) if getattr(settings, "REDIS_ENABLE", False) else ""
if location: if location:
return location return location
# 通过api 获取再缓存redis # 通过api 获取再缓存redis
@ -176,7 +178,8 @@ def get_login_location(request, *args, **kwargs):
r = requests.get(apiurl) r = requests.get(apiurl)
content = r.content.decode('GBK') content = r.content.decode('GBK')
location = str(content).replace('\r', '').replace('\n', '')[:64] location = str(content).replace('\r', '').replace('\n', '')[:64]
cache.set(request_ip, location, 86400) if getattr(settings, "REDIS_ENABLE", False):
cache.set(request_ip, location, 86400)
return location return location
except Exception as e: except Exception as e:
pass pass

View File

@ -44,3 +44,5 @@ API_LOG_ENABLE = True
API_LOG_METHODS = ['POST', 'DELETE', 'PUT'] # 'ALL' or ['POST', 'DELETE'] API_LOG_METHODS = ['POST', 'DELETE', 'PUT'] # 'ALL' or ['POST', 'DELETE']
# 接口权限 # 接口权限
INTERFACE_PERMISSION = True INTERFACE_PERMISSION = True
# 是否开启
ENABLE_LOGIN_LOCATION = False