#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json import time import urllib import uuid import boto3 import threading import logging import requests from boto3.session import Session from django.http import JsonResponse, HttpResponseRedirect, HttpResponse from django.views.generic.base import View from Controller.CheckUserData import date_handler from Model.models import Device_Info, Role, MenuModel, RequestRecordModel, iotdeviceInfoModel from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject from Object.UidTokenObject import UidTokenObject from Service.CommonService import CommonService from django.db.models import Q, F from time import strftime class LogManagementView(View): def get(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.GET, request, operation) def post(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.POST, request, operation) def validation(self, request_dict, request, operation): language = request_dict.get('language', 'en') response = ResponseObject(language, 'pc') if operation == '??': return 0 else: tko = TokenObject( request.META.get('HTTP_AUTHORIZATION'), returntpye='pc') # if tko.code != 0: # return response.json(tko.code) response.lang = tko.lang userID = tko.userID if operation == 'getRequestList': return self.getRequestList(request_dict, response) elif operation == 'getDeviceIotInfoList': return self.getDeviceIotInfoList(request_dict, response) elif operation == 'requestPublishMqtt': return self.requestPublishMqtt(request_dict, response) else: return response.json(404) def getRequestList(self, request_dict, response): pageNo = request_dict.get('pageNo', None) pageSize = request_dict.get('pageSize', None) method = request_dict.get('method', None) url = request_dict.get('url', None) parameter = request_dict.get('parameter', None) status_code = request_dict.get('status_code', None) reason_phrase = request_dict.get('reason_phrase', None) if not all([pageNo, pageSize]): return response.json(444) page = int(pageNo) line = int(pageSize) try: request_qs = RequestRecordModel.objects.all() if method: request_qs = request_qs.filter(method=method) if url: request_qs = request_qs.filter(url__contains=url) if parameter: request_qs = request_qs.filter(parameter__contains=parameter) if status_code: request_qs = request_qs.filter(status_code=status_code) if reason_phrase: request_qs = request_qs.filter(reason_phrase=reason_phrase) count = request_qs.count() request_qs = request_qs[(page - 1) * line:page * line] qs_list = [] for requsetobj in request_qs: qs_list.append({ 'id': requsetobj.id, 'method': requsetobj.method, 'url': requsetobj.url, 'parameter': requsetobj.parameter, 'execute_time': round(requsetobj.execute_time, 2), # 时间保留小数点后两位 'status_code': requsetobj.status_code, 'reason_phrase': requsetobj.reason_phrase, 'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"), }) return response.json( 0, {'list': qs_list, 'total': count}) except Exception as e: print(e) return response.json(500, repr(e)) def getDeviceIotInfoList(self, request_dict, response): serial_number = request_dict.get('serial_number', None) uid = request_dict.get('uid', None) pageNo = request_dict.get('pageNo', None) pageSize = request_dict.get('pageSize', None) if not all([pageNo, pageSize]): return response.json(444) page = int(pageNo) line = int(pageSize) try: if serial_number or uid: if serial_number: iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number__contains=serial_number) if uid: iot_device_info_qs = iotdeviceInfoModel.objects.filter(uid__contains=uid) if not iot_device_info_qs.exists(): return response.json(0) total = len(iot_device_info_qs) iot_device_info_qs = iot_device_info_qs.values('serial_number', 'uid', 'thing_name', 'thing_groups', 'add_time', 'update_time')[(page - 1) * line:page * line] else: total = iotdeviceInfoModel.objects.filter().count() iot_device_info_qs = iotdeviceInfoModel.objects.filter().values('serial_number', 'uid', 'thing_name', 'thing_groups', 'add_time', 'update_time')[(page - 1) * line:page * line] iot_device_info_list = CommonService.qs_to_list(iot_device_info_qs) # 获取序列号的uid for iot_device_info in iot_device_info_list: if not iot_device_info['uid']: device_info_qs = Device_Info.objects.filter(serial_number__contains=iot_device_info['serial_number']).values('UID') if device_info_qs.exists(): iot_device_info['uid'] = device_info_qs[0]['UID'] return response.json(0, {'list': iot_device_info_list, 'total': total}) except Exception as e: print(e) return response.json(500, repr(e)) def requestPublishMqtt(self, request_dict, response): # 通用发布MQTT主题通知 msg = request_dict.get('msg', None) thing_name = request_dict.get('thing_name', None) topic_name = request_dict.get('topic_name', None) if not all([msg, thing_name, topic_name]): return response.json(444) try: # 获取数据组织将要请求的url iot = iotdeviceInfoModel.objects.filter(thing_name=thing_name).values('endpoint', 'token_iot_number') if not iot.exists(): return response.json(10043) endpoint = iot[0]['endpoint'] Token = iot[0]['token_iot_number'] # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1 # post请求url发布MQTT消息 url = 'https://{}/topics/{}'.format(endpoint, topic_name) authorizer_name = 'Ansjer_Iot_Auth' signature = CommonService.rsa_sign(Token) # Token签名 headers = {'x-amz-customauthorizer-name': authorizer_name, 'Token': Token, 'x-amz-customauthorizer-signature': signature} msg = eval(msg) r = requests.post(url=url, headers=headers, json=msg, timeout=2) if r.status_code == 200: res = r.json() if res['message'] == 'OK': return response.json(0) return response.json(10044) else: return response.json(10044) except Exception as e: return response.json(500, repr(e))