From 97574eac9861917003ab4a260473b327af084d48 Mon Sep 17 00:00:00 2001
From: fengxuan <fengxuan@situdata.com>
Date: Thu, 30 Mar 2023 14:48:17 +0800
Subject: [PATCH] MOD:文件和参数不能同时获取的问题

---
 src/apps/doc/views.py | 20 ++++++++++----------
 src/common/mixins.py  | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 10 deletions(-)

diff --git a/src/apps/doc/views.py b/src/apps/doc/views.py
index f91f089..8bb8871 100644
--- a/src/apps/doc/views.py
+++ b/src/apps/doc/views.py
@@ -17,7 +17,7 @@ from webargs import fields, validate
 from webargs.djangoparser import use_args, parser
 from settings import conf
 from common import response
-from common.mixins import GenericView
+from common.mixins import GenericView,DocGenericView
 from common.tools.file_tools import file_write
 from common.redis_cache import redis_handler as rh
 from .models import (
@@ -1039,7 +1039,7 @@ class CompareOfflineView(GenericView):
         '''
 
 
-class DocView(GenericView, DocHandler):
+class DocView(DocGenericView, DocHandler):
 
     # 文件列表页
     @use_args(doc_list_args, location='querystring')
@@ -1096,21 +1096,21 @@ class DocView(GenericView, DocHandler):
         return response.ok(data=res)
 
     # 上传pdf,模拟下单
-    @use_args(upload_pdf_args, location='files')
-    def post(self, request, args):
+    # @use_args(upload_pdf_args)
+    def post(self, request):
         random_int = random.randint(0, consts.TIME_NUM)
         metadata_version_id = str(int(time.time()) - random_int)
 
-        pdf_file = args.get('pdf_file')
+        pdf_file = request.FILES.get('pdf_file')
         if isinstance(pdf_file.name, str):
             if not pdf_file.name.endswith('pdf') and not pdf_file.name.endswith('PDF'):
                 self.invalid_params(msg='invalid params: not a PDF file')
 
-        business_type = args.get('business_type', '')
-        document_scheme = args.get('document_scheme', '')
-        data_source = args.get('data_source', '')
-        document_name = args.get('document_name', '')
-
+        business_type = request.POST.get('business_type', '')
+        document_scheme = request.POST.get('document_scheme', '')
+        data_source = request.POST.get('data_source', '')
+        document_name = request.POST.get('document_name', '')
+        args = {'business_type':business_type,'document_scheme':document_scheme,'data_source':data_source,'document_name':document_name,'pdf_file':pdf_file}
         # business_type = random.choice(consts.BUSINESS_TYPE_LIST)
         # business_type = consts.BUSINESS_TYPE_LIST[0]
         tmp_save_path = os.path.join(conf.DATA_DIR, business_type, '{0}.pdf'.format(metadata_version_id))
diff --git a/src/common/mixins.py b/src/common/mixins.py
index 52dc083..6b15fca 100644
--- a/src/common/mixins.py
+++ b/src/common/mixins.py
@@ -104,6 +104,62 @@ class GenericView(LoggerMixin, GenericExceptionMixin, GenericAPIView):
     def get_object(self):
         return None
 
+class DocGenericView(LoggerMixin, GenericExceptionMixin, GenericAPIView):
+    need_print_logger = True
+
+    def print_logger(self, request):
+        # parameters = getattr(request, request.method, {})
+        parameters = None
+        if not parameters:
+            parameters = getattr(request, 'data', {})
+        if not parameters:
+            parameters = {}
+        parameters_string = ''
+        for key, value in parameters.items():
+            parameters_string += '[%s=%s] ' % (key, value)
+        for key, value in self.kwargs.items():
+            parameters_string += '[%s=%s] ' % (key, value)
+        if request.user and not isinstance(request.user, AnonymousUser):
+            user_id = request.user.id
+        else:
+            user_id = 0
+        self.running_log.info('[%s_%s_request] with parameters [user_id=%s] %s'
+                              % (self.__class__.__name__, request.method,
+                                 user_id, parameters_string))
+
+    def dispatch(self, request, *args, **kwargs):
+        """
+        `.dispatch()` is pretty much the same as Django's regular dispatch,
+        but with extra hooks for startup, finalize, and exception handling.
+        """
+        self.args = args
+        self.kwargs = kwargs
+        request = self.initialize_request(request, *args, **kwargs)
+        self.request = request
+        self.headers = self.default_response_headers  # deprecate?
+        try:
+            self.initial(request, *args, **kwargs)
+
+            # Get the appropriate handler method
+            if request.method.lower() in self.http_method_names:
+                handler = getattr(self, request.method.lower(),
+                                  self.http_method_not_allowed)
+            else:
+                handler = self.http_method_not_allowed
+
+            if self.need_print_logger:
+                self.print_logger(request)
+
+            response = handler(request, *args, **kwargs)
+        except Exception as exc:
+            response = self.handle_exception(exc)
+
+        self.response = self.finalize_response(
+            request, response, *args, **kwargs)
+        return self.response
+
+    def get_object(self):
+        return None
 
 class IWABaseView:
 
--
libgit2 0.24.0