| 
					
				 | 
			
			
				@@ -0,0 +1,89 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#!/usr/bin/env python3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# -*- coding: utf-8 -*- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import boto3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import botocore 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from django.views.generic.base import View 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from Model.models import DeviceLogModel 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from Service.CommonService import CommonService 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from Object.ResponseObject import ResponseObject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from Ansjer.config import REGION_NAME, ACCESS_KEY_ID, SECRET_ACCESS_KEY, LOG_BUCKET 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class DeviceLogView(View): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def get(self, request, *args, **kwargs): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        request.encoding = 'utf-8' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        operation = kwargs.get('operation', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return self.validate(request.GET, operation) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def post(self, request, *args, **kwargs): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        request.encoding = 'utf-8' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        operation = kwargs.get('operation', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return self.validate(request.POST, operation) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def validate(self, request, request_dict, operation): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response = ResponseObject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        token = request_dict.get('token', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        time_stamp = request_dict.get('time_stamp', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 时间戳token校验 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not CommonService.check_time_stamp_token(token, time_stamp): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(13) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if operation == 'getUploadUrl': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self.getUploadUrl(request_dict, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elif operation == 'uploaded': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return self.uploaded(request, request_dict, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(414) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def getUploadUrl(self, request_dict, response): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        uid = request_dict.get('uid', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        file_type = request_dict.get('log_type', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not all([uid, file_type]): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(444) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            uid = CommonService.decode_data(uid) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 日志文件名 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            name = CommonService.createOrderID() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filename = str(name) + '.' + file_type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            obj = 'device_log/{uid}/'.format(uid=uid) + filename 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            aws_s3_client = boto3.client( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                's3', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                region_name=REGION_NAME, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                aws_access_key_id=ACCESS_KEY_ID, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                aws_secret_access_key=SECRET_ACCESS_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                config=botocore.client.Config(signature_version='s3v4'), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            put_url = aws_s3_client.generate_presigned_url( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ClientMethod='put_object', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Params={ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'Bucket': LOG_BUCKET, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'Key': obj 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ExpiresIn=3600 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(0, {'put_url': put_url, 'filename': filename}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(500, repr(e)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def uploaded(self, request, request_dict, response): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        uid = request_dict.get('uid', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        status = request_dict.get('status', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        filename = request_dict.get('filename', None) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not all([uid, status, filename]): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(444) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            status = int(status) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            uid = CommonService.decode_data(uid) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ip = CommonService.get_ip_address(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            DeviceLogModel.objects.create(uid=uid, ip=ip, status=status, filename=filename) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return response.json(500, repr(e)) 
			 |