From 24fbf1287bb7e8eda1a765d97e9b0200c6953e92 Mon Sep 17 00:00:00 2001 From: VladislavOstapov Date: Sun, 23 Apr 2023 15:33:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D1=85?= =?UTF-8?q?=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20http=20error=20cod?= =?UTF-8?q?e=20=D0=BA=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=83=20(400=20?= =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=20=D1=81=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BC=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/api_methods.py | 6 +++++- api/api_utils.py | 28 +++++++++++++++++++++++----- api/views.py | 10 ++-------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/api/api_methods.py b/api/api_methods.py index 9718758..2090f09 100755 --- a/api/api_methods.py +++ b/api/api_methods.py @@ -3,6 +3,8 @@ import time from datetime import date as dt import traceback +from django.http import HttpResponseNotFound + from .api_media_utils import * from .api_utils import * from .models import * @@ -708,7 +710,9 @@ class ApiMedia: return res except Exception: traceback.print_exc() - return make_error_object(Exception(API_ERROR_NOT_FOUND, "object in storage not found")) + + # return make_error_object(Exception(API_ERROR_NOT_FOUND, "object in storage not found")) + return HttpResponseNotFound() @staticmethod @api_method("media.list", diff --git a/api/api_utils.py b/api/api_utils.py index a6dd04d..230980f 100755 --- a/api/api_utils.py +++ b/api/api_utils.py @@ -1,4 +1,6 @@ -from django.http import HttpResponse +import json + +from django.http import * from .api_params import * @@ -24,6 +26,13 @@ def api_make_response(response): # ) +def default_serializer(obj): + try: + return obj.to_json() + except Exception: + return str(obj) + + def api_method(func_name, doc="", params: list or None = None, returns=""): """ Декоратор для методов API, автоматически валидирует и передает параметры методам @@ -56,9 +65,12 @@ def api_method(func_name, doc="", params: list or None = None, returns=""): # print(f"errors: {errors}, args: {func_args}") if len(errors) > 0: if len(errors) == 1: - return make_error_object(errors[0]) + obj = make_error_object(errors[0]) else: - return make_error_object(errors) + obj = make_error_object(errors) + response = HttpResponseBadRequest(json.dumps(obj, default=default_serializer, ensure_ascii=False, indent=4)) + response.headers["Content-type"] = "application/json; charset=utf-8" + return response else: try: if asyncio.iscoroutinefunction(func): @@ -69,10 +81,16 @@ def api_method(func_name, doc="", params: list or None = None, returns=""): return make_error_object(ex) if out is None: - return make_error_object(Exception(API_ERROR_INTERNAL_ERROR, "method returned null object")) + obj = make_error_object(Exception(API_ERROR_INTERNAL_ERROR, "method returned null object")) + response = HttpResponseServerError(json.dumps(obj, default=default_serializer, ensure_ascii=False, indent=4)) + response.headers["Content-type"] = "application/json; charset=utf-8" + return response if not isinstance(out, dict) and not isinstance(out, HttpResponse): - return make_error_object(Exception(API_ERROR_INTERNAL_ERROR, "method returned invalid object type")) + obj = make_error_object(Exception(API_ERROR_INTERNAL_ERROR, "method returned invalid object type")) + response = HttpResponseServerError(json.dumps(obj, default=default_serializer, ensure_ascii=False, indent=4)) + response.headers["Content-type"] = "application/json; charset=utf-8" + return response return out diff --git a/api/views.py b/api/views.py index bde1cb9..1936703 100755 --- a/api/views.py +++ b/api/views.py @@ -4,6 +4,7 @@ from django.http import HttpResponse, HttpResponseBadRequest from django.views.decorators.csrf import csrf_exempt from .api_methods import api_call_method, api_get_documentation +from .api_utils import default_serializer def view_methods(request): @@ -11,13 +12,6 @@ def view_methods(request): return render(request, 'index.html', {'api_methods': methods}) -def _default_serializer(obj): - try: - return obj.to_json() - except Exception: - return str(obj) - - async def call_method(request, method_name): if request.method == "GET": params = request.GET @@ -33,7 +27,7 @@ async def call_method(request, method_name): out = await api_call_method(request, method_name, api_params) if isinstance(out, dict): - response = HttpResponse(json.dumps(out, default=_default_serializer, ensure_ascii=False, indent=4)) + response = HttpResponse(json.dumps(out, default=default_serializer, ensure_ascii=False, indent=4)) response.headers["Content-type"] = "application/json; charset=utf-8" return response else: