环境描述
由于工作需要,业务项目需要部署在内网中,然后通过另一台可访问公网的服务器作为代理服务器,实现公网访问业务
问题描述
由于业务服务不能直接访问公网,关于钉钉业务代码无法执行
限制说明
- 业务服务器不能开通公网访问,只能访问代理服务器
- 原有代码不能过多改动,尽量少改
实现思路
- 在代理服务器构建服务接收钉钉服务接口请求,并转发至公网,钉钉服务接口成功响应后,数据再返回到业务服务器的响应中
- 使用sanic的中间件拦截所有请求以及对应的请求参数
代码展示
@app.middleware('request')
def handle_request(request):
dingDingTalk = DingTalkClient(request)
return json(status=200, body=dingDingTalk.get_result())
@app.route('/<path>', methods=["GET", "POST"], strict_slashes=False)
async def path(request):
return json(status=200, body={})
@app.route('/<path>/<path2>', methods=["GET", "POST"], strict_slashes=False)
async def path2(request):
return json(status=200, body={})
@app.route('/<path>/<path2>/<path3>', methods=["GET", "POST"], strict_slashes=False)
async def path3(request):
return json(status=200, body={})
@app.route('/<path>/<path2>/<path3>/<path4>', methods=["GET", "POST"], strict_slashes=False)
async def path4(request):
return json(status=200, body={})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=800, debug=False)
说明: 由于本身框架本身会匹配路由, /<path 是为了让请求顺利抵达中间件