diff --git a/backend/application/settings.py b/backend/application/settings.py index bf35139..0286de8 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -62,6 +62,7 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ + "dvadmin.utils.middleware.HealthCheckMiddleware", "django.middleware.security.SecurityMiddleware", "whitenoise.middleware.WhiteNoiseMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", diff --git a/backend/dvadmin/utils/filters.py b/backend/dvadmin/utils/filters.py index ad3d056..a2b470a 100644 --- a/backend/dvadmin/utils/filters.py +++ b/backend/dvadmin/utils/filters.py @@ -351,11 +351,16 @@ class CustomDjangoFilterBackend(DjangoFilterBackend): queries = [] for search_term_key in filterset.data.keys(): orm_lookup = self.find_filter_lookups(orm_lookups, search_term_key) - # print(search_term_key, orm_lookup) - if not orm_lookup: + if not orm_lookup or filterset.data.get(search_term_key) == '': continue - query = Q(**{orm_lookup: filterset.data[search_term_key]}) - queries.append(query) + filterset_data_len = len(filterset.data.getlist(search_term_key)) + if filterset_data_len == 1: + query = Q(**{orm_lookup: filterset.data[search_term_key]}) + queries.append(query) + elif filterset_data_len == 2: + orm_lookup += '__range' + query = Q(**{orm_lookup: filterset.data.getlist(search_term_key)}) + queries.append(query) if len(queries) > 0: conditions.append(reduce(operator.and_, queries)) queryset = queryset.filter(reduce(operator.and_, conditions)) diff --git a/backend/dvadmin/utils/middleware.py b/backend/dvadmin/utils/middleware.py index 5443d14..f4717a4 100644 --- a/backend/dvadmin/utils/middleware.py +++ b/backend/dvadmin/utils/middleware.py @@ -2,9 +2,11 @@ 日志 django中间件 """ import json +import logging from django.conf import settings from django.contrib.auth.models import AnonymousUser +from django.http import HttpResponse, HttpResponseServerError from django.utils.deprecation import MiddlewareMixin from dvadmin.system.models import OperationLog @@ -87,3 +89,58 @@ class ApiLoggingMiddleware(MiddlewareMixin): if self.methods == 'ALL' or request.method in self.methods: self.__handle_response(request, response) return response + +logger = logging.getLogger("healthz") +class HealthCheckMiddleware(object): + """ + 存活检查中间件 + """ + def __init__(self, get_response): + self.get_response = get_response + # One-time configuration and initialization. + + def __call__(self, request): + if request.method == "GET": + if request.path == "/readiness": + return self.readiness(request) + elif request.path == "/healthz": + return self.healthz(request) + return self.get_response(request) + + def healthz(self, request): + """ + Returns that the server is alive. + """ + return HttpResponse("OK") + + def readiness(self, request): + # Connect to each database and do a generic standard SQL query + # that doesn't write any data and doesn't depend on any tables + # being present. + try: + from django.db import connections + for name in connections: + cursor = connections[name].cursor() + cursor.execute("SELECT 1;") + row = cursor.fetchone() + if row is None: + return HttpResponseServerError("db: invalid response") + except Exception as e: + logger.exception(e) + return HttpResponseServerError("db: cannot connect to database.") + + # Call get_stats() to connect to each memcached instance and get it's stats. + # This can effectively check if each is online. + try: + from django.core.cache import caches + from django.core.cache.backends.memcached import BaseMemcachedCache + for cache in caches.all(): + if isinstance(cache, BaseMemcachedCache): + stats = cache._cache.get_stats() + if len(stats) != len(cache._servers): + return HttpResponseServerError("cache: cannot connect to cache.") + except Exception as e: + logger.exception(e) + return HttpResponseServerError("cache: cannot connect to cache.") + + return HttpResponse("OK")