Ver código fonte

新增:气象站api接口权限认证

zhaiyifei 3 anos atrás
pai
commit
136508cdbe
3 arquivos alterados com 112 adições e 2 exclusões
  1. 51 2
      apps/Equipment/views.py
  2. 32 0
      bigdataAPI/settings.py
  3. 29 0
      utils/permissions.py

+ 51 - 2
apps/Equipment/views.py

@@ -6,9 +6,10 @@ import time
 from .serializers import SearchEquipSerializer, DeviceListSerializer, DeviceDetailSerializer
 from utils.utils import get_equip_list
 from utils.JWTAuthentication_diy import MyJWTAuthentication
-from utils.permissions import ModulePermission, DeviceDetailPermission
+from utils.permissions import ModulePermission, DeviceDetailPermission, AccessPermission
 from utils.MyRateThrottle import DeviceListRateThrottle, DeviceDetailRateThrottle
-
+from utils.paginations import CustomPagination
+from utils.db_utils import MongoDBTools
 from .models import Device, QXZData
 
 
@@ -113,3 +114,51 @@ class DeviceDetail(GenericAPIView):
         device_queryset = self.get_queryset().filter(device_id_id=deviceId, add_time__gt=start_time)
         serializer = self.get_serializer(instance=device_queryset, many=True)
         return Response(serializer.data)
+
+
+def get_page_or_page_size(request):
+    try:
+        page = int(request.query_params['page']) - 1
+        if page < 0:
+            page = 0
+    except Exception as e:
+        page = 0
+
+    try:
+        page_size = int(request.query_params['page_size'])
+        if page_size < 0:
+            page_size = 10
+    except Exception as e:
+        page_size = 10
+    return page, page_size
+
+
+class QxzDeviceListView(APIView):
+    permission_classes = [AccessPermission]
+
+    def get(self, request, *args, **kwargs):
+        """获取气象站设备列表接口"""
+        uid = request.uid
+        wheres = {
+            '$or': [
+                {'owner_uid': uid},
+                {'user_dealer': uid}
+            ]
+        },
+        project = {
+            'device_id': '$device_id',
+            'uptime': '$uptime',
+            'device_status': '$device_status',
+            'lng': '$lng',
+            'lat': '$lat'
+        }
+        page, page_size = get_page_or_page_size(request)
+        skip, limit = page * page_size, page_size
+        m = MongoDBTools(db_name='smartfarming', table_name='sa_device')
+        data = m.find_many(wheres=wheres, options=project, skip=skip, limit=limit)
+        result = []
+        for item in data:
+            result.append(item)
+        return Response(result)
+
+

+ 32 - 0
bigdataAPI/settings.py

@@ -78,6 +78,38 @@ WSGI_APPLICATION = 'bigdataAPI.wsgi.application'
 # Database
 # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
 
+if DEBUG:
+    USER_CONFIG = {
+        'mysql': {
+            'host': 'localhost',
+            'user': 'root',
+            'pwd': 'yfkj@6020',
+            'port': 3306
+        },
+        'mongodb': {
+            'host': 'localhost',
+            'user': 'root',
+            'pwd': 'yfkj@6020',
+            'port': 27017
+        }
+    }
+else:
+    USER_CONFIG = {
+        'mysql': {
+            'host': 'localhost',
+            'user': 'root',
+            'pwd': 'yfkj@6020',
+            'port': 61882
+        },
+        'mongodb': {
+            'host': 'localhost',
+            'user': 'root',
+            'pwd': 'yfkj@6020',
+            'port': 57017
+        }
+    }
+
+
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',

+ 29 - 0
utils/permissions.py

@@ -2,6 +2,7 @@
 
 from rest_framework.permissions import BasePermission
 from apps.Equipment.models import Device
+from .db_utils import MySQLTool
 
 
 class RegisterViewPermission(BasePermission):
@@ -44,3 +45,31 @@ class DeviceDetailPermission(BasePermission):
                 return False
         except:
             return False
+
+
+def get_bigdata_user_uid(token):
+    sql = f'''select uid from sa_device_user where api_token={token}'''
+    m = MySQLTool()
+    result = m.execute_by_one(sql)
+    uid = result['uid']
+    return uid
+
+
+class AccessPermission(BasePermission):
+    def has_permission(self, request, view):
+        try:
+            auth = request.MATE['HTTP_AUTHORIZATION']
+            temp_list = auth.split()
+            if temp_list[0] != 'Bearer':
+                raise Exception()
+            token = temp_list[1]
+            try:
+                uid = request.session['bigdata_uid']
+            except KeyError as e:
+                uid = get_bigdata_user_uid(token)
+                request.session['bigdata_uid'] = uid
+                request.session.save()
+            request.bigdata_uid = uid
+        except Exception as e:
+            return False
+        return True