Bladeren bron

增加2维数据代理接口,配置文件增加内置token,代理服务配置

zhangnaiwen 2 jaren geleden
bovenliggende
commit
f861de3c81
5 gewijzigde bestanden met toevoegingen van 98 en 22 verwijderingen
  1. 3 2
      docker-compose.yml
  2. 1 1
      scripts/built.sh
  3. 3 2
      src/app/api/__init__.py
  4. 51 15
      src/app/api/apis.py
  5. 40 2
      src/app/configs/config.py

+ 3 - 2
docker-compose.yml

@@ -14,8 +14,9 @@ service:
     - UWSGI_HARAKIRI=20
     - UWSGI_PY_OPTIMIZE=0
 
-    - OAUTH_HOST=121.43.55.7:8888
-    - NGINX_HOST=192.168.1.37:80
+  volumes:
+    - D:\code\proxy_nginx_server\src\config.py:/work/nginx_agent/src/configs/config.py
+    - D:\data/logs:/data/logs
 
   privileged: true
 

+ 1 - 1
scripts/built.sh

@@ -1,4 +1,4 @@
 #!/bin/bash
 
 docker build -f base/Dockerfile -t proxy_nginx_server_base:latest .
-docker build -t proxy_nginx_server:1.0.0 .
+docker build -t proxy_nginx_server:1.0.1 .

+ 3 - 2
src/app/api/__init__.py

@@ -1,7 +1,8 @@
 from flask_restful import Api
 
-from app.api.apis import AgentApi
+from app.api.apis import AgentApi, MapServer
 
 api = Api()
 
-api.add_resource(AgentApi, '/<path:path>')
+api.add_resource(AgentApi, '/<path:path>')
+api.add_resource(MapServer, '/')

+ 51 - 15
src/app/api/apis.py

@@ -1,4 +1,4 @@
-import mimetypes
+import time
 
 import requests
 from flask import make_response, request, abort
@@ -7,29 +7,65 @@ from flask_restful import Resource
 from app.configs import config
 
 
-class AgentApi(Resource):
+def verify_token(token, servertype):
+    if token not in config.built_in_token or token not in config.token_dict:  # 不是内置token请求oauth或不在字记录典里请求oauth
+        # token ,记录token,token为key,时间错为value
+        validate_token_rep = requests.post('http://%s/oauth/api/user/getUserByToken' % config.OAUTH_HOST,
+                                           headers={'token': token},
+                                           data={'strUrl': servertype, 'serviceId': 8})
+
+    elif time.time() > config.token_dict.get(token) + 172800:
+        # token在字典里,判断token是否超过48小时,超过删除token请求oauth。记录token,token为key,时间错为value
+        config.token_dict.pop(token)
+        validate_token_rep = requests.post('http://%s/oauth/api/user/getUserByToken' % config.OAUTH_HOST,
+                                           headers={'token': token},
+                                           data={'strUrl': servertype, 'serviceId': 8}
+                                           )
+
+    return validate_token_rep.json()
 
+
+class AgentApi(Resource):
     def get(self, path):
-        args = request.args
+
+        args = request.args.to_dict()
+
         try:
             token = args.pop('token')
+            servertype = args.pop('servertype')
 
-            # token 在配置里则不验证,48小时删除配置里的token
-            validate_token_rep = requests.get('http://%s/oauth/api/user/validateToken' % config.OAUTH_HOST,
-                                              headers={'token': token}).json()
+            validate_token_rep = verify_token(token, servertype)
             if validate_token_rep.get('code') != 200:
                 return validate_token_rep
 
-            # 请求nginx
-            nginx_rep = requests.get('http://%s/%s' % (config.NGINX_HOST, path), params=args if len(args) > 0 else None)
+            config.token_dict[token] = time.time()
+            # 替换ip转发请求
+            rep = requests.get('{server}/{path}'.format(server=config.ServerConfig.get(servertype), path=path),
+                               params=args)
+            response = make_response(rep.content)
+            response.headers['Content-Type'] = rep.headers.get('Content-Type')
+
+            return response
+
+        except KeyError:
+            abort(418)
+
+
+class MapServer(Resource):
+    def get(self):
+        args = request.args.to_dict()
+        try:
+            token = args.pop('token')
+            servertype = args.pop('servertype')
+
+            validate_token_rep = verify_token(token, servertype)
+            if validate_token_rep.get('code') != 200:
+                return validate_token_rep
+            # 替换ip转发请求
+            rep = requests.get(config.ServerConfig.get(servertype), params=args)
 
-            response = make_response(nginx_rep.content)
-            filename = path.split('/')[-1]
-            mime_type = mimetypes.guess_type(filename)[0]
-            if mime_type is None:
-                mime_type = 'application/octet-stream'
-            response.headers['Content-Type'] = mime_type
-            response.headers['Content-Disposition'] = 'attachment; filename={}'.format(filename.encode().decode('latin-1'))
+            response = make_response(rep.text)
+            response.headers['Content-Type'] = 'application/javascript;charset=UTF-8'
             return response
 
         except KeyError:

+ 40 - 2
src/app/configs/config.py

@@ -1,4 +1,42 @@
 import os
 
-OAUTH_HOST = os.environ.get('OAUTH_HOST', '121.43.55.7:8888')
-NGINX_HOST = os.environ.get('NGINX_HOST', '192.168.1.37:80')
+# oauth地址
+OAUTH_HOST = '121.43.55.7:8888'
+
+# 请求过的token记录
+token_dict = {}
+
+# 内置token
+built_in_token = [
+    '65463DEE-620A-0ED5-2385-17ECD07CD351',
+    'C651EBF8-5728-4F2F-1C1F-52A9F1BDC889',
+    '079B1D50-DE99-AF49-FF56-DCB95D3E3147',
+    'C4BCA7C6-DF66-4A7D-2931-A258DFEFF8AB',
+    'CFC5CEB8-755F-0916-899C-4CD578F323CC',
+    'DF45046F-AE7B-50B3-C084-FECDE82CEE32',
+    '1472624D-EBC3-8B49-F1A2-B21446925D48',
+    '1C73AFA8-3567-E2CC-048D-6ECAB6DD58D6',
+    '40DC31DD-2FA7-F6D1-5197-D5B9A3E823EE',
+    '622067E9-93E5-D8EC-E677-85B58A63C0C7',
+]
+
+# 代理服务配置
+ServerConfig = {
+    'NatGeo_World_Map': 'https://server.arcgisonline.com/arcgis/rest/services/NatGeo_World_Map/MapServer',
+
+    'USA_Topo_Maps': 'https://server.arcgisonline.com/arcgis/rest/services/USA_Topo_Maps/MapServer',
+
+    'World_Imagery': 'https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer',
+
+    'World_Physical_Map': 'https://server.arcgisonline.com/arcgis/rest/services/World_Physical_Map/MapServer',
+
+    'World_Shaded_Relief': 'https://server.arcgisonline.com/arcgis/rest/services/World_Shaded_Relief/MapServer',
+
+    'World_Street_Map': 'https://server.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer',
+
+    'World_Terrain_Base': 'https://server.arcgisonline.com/arcgis/rest/services/World_Terrain_Base/MapServer',
+
+    'World_Topo_Map': 'https://server.arcgisonline.com/arcgis/rest/services/World_Topo_Map/MapServer',
+
+    '3DModel': 'http://192.168.1.37:80/model_data/QPXZFUZX/20220922-1/output'
+}