DeviceLogController.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import time
  4. import boto3
  5. import botocore
  6. from django.views.generic.base import View
  7. from Model.models import DeviceLogModel
  8. from Service.CommonService import CommonService
  9. from Object.ResponseObject import ResponseObject
  10. from Ansjer.config import REGION_NAME, LOG_BUCKET
  11. from django.conf import settings
  12. ACCESS_KEY_ID = settings.ACCESS_KEY_ID
  13. SECRET_ACCESS_KEY = settings.SECRET_ACCESS_KEY
  14. class DeviceLogView(View):
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. operation = kwargs.get('operation', None)
  18. return self.validate(request, request.GET, operation)
  19. def post(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation', None)
  22. return self.validate(request, request.POST, operation)
  23. def validate(self, request, request_dict, operation):
  24. response = ResponseObject()
  25. token = request_dict.get('token', None)
  26. time_stamp = request_dict.get('time_stamp', None)
  27. # 时间戳token校验
  28. if not CommonService.check_time_stamp_token(token, time_stamp):
  29. return response.json(13)
  30. if operation == 'getUploadUrl':
  31. return self.getUploadUrl(request_dict, response)
  32. elif operation == 'uploaded':
  33. return self.uploaded(request, request_dict, response)
  34. else:
  35. return response.json(414)
  36. def getUploadUrl(self, request_dict, response):
  37. uid = request_dict.get('uid', None)
  38. serial_number = request_dict.get('serial_number', None)
  39. file_type = request_dict.get('file_type', None)
  40. file_num = int(request_dict.get('file_num', 1))
  41. # uid,serial_number二传一
  42. if not (uid or serial_number and file_type):
  43. return response.json(444)
  44. try:
  45. device_id = uid if uid else serial_number
  46. device_id = CommonService.decode_data(device_id)
  47. put_url_list = []
  48. for num in range(file_num):
  49. # 日志文件名
  50. name = CommonService.createOrderID()
  51. filename = str(name) + '.' + file_type
  52. obj = 'device_log/{device_id}/'.format(device_id=device_id) + filename
  53. aws_s3_client = boto3.client(
  54. 's3',
  55. region_name=REGION_NAME,
  56. aws_access_key_id=ACCESS_KEY_ID,
  57. aws_secret_access_key=SECRET_ACCESS_KEY,
  58. config=botocore.client.Config(signature_version='s3v4'),
  59. )
  60. put_url = aws_s3_client.generate_presigned_url(
  61. ClientMethod='put_object',
  62. Params={
  63. 'Bucket': LOG_BUCKET,
  64. 'Key': obj
  65. },
  66. ExpiresIn=3600
  67. )
  68. put_url_dict = {'put_url': put_url, 'filename': filename}
  69. put_url_list.append(put_url_dict)
  70. return response.json(0, {'put_url_list': put_url_list})
  71. except Exception as e:
  72. print(e)
  73. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  74. def uploaded(self, request, request_dict, response):
  75. uid = request_dict.get('uid', None)
  76. serial_number = request_dict.get('serial_number', None)
  77. status = request_dict.get('status', None)
  78. filename = request_dict.get('filename', None)
  79. # uid,serial_number二传一
  80. if not (uid or serial_number and status and filename):
  81. return response.json(444)
  82. try:
  83. data_dict = {
  84. 'filename': filename,
  85. 'status': int(status),
  86. 'ip': CommonService.get_ip_address(request),
  87. }
  88. if uid:
  89. data_dict['uid'] = CommonService.decode_data(uid)
  90. else:
  91. data_dict['serial_number'] = CommonService.decode_data(serial_number)
  92. DeviceLogModel.objects.create(**data_dict)
  93. return response.json(0)
  94. except Exception as e:
  95. print(e)
  96. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))