15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 【实战】Django + VueJS 打造内网 Postman

【实战】Django + VueJS 打造内网 Postman

时间:2023-07-21 01:27:02 | 来源:网站运营

时间:2023-07-21 01:27:02 来源:网站运营

【实战】Django + VueJS 打造内网 Postman:
就和你们看到 内网Postman 是懵逼的一样,我接到一个叫非标操作的需求时候我也是懵逼的

背景

我司经常要和 API 打交道,特别是我们萌(ku)萌(ku)哒的应用运维同学

举个例子:

在 UCloud 官网控制台的 基础网络 服务中,客户可以自助的申请资源,例如外网IP:

(注:UCloud 控制台申请 EIP的模态框)

我们也提供了完善的 API 供客户的 DevOps 做二次开发,背景交代完了,开始讲故事:

有一位客户在我们云主机上的服务最近访问量暴增,想买100个外网IP,他告诉我们客服:我钱充满了,你帮我创建100个外网IP,客服告诉他:你可以在控制台这样...这样...操作,或者使用你的签名密钥这样...这样...调 API,客户说:我知道,但是我不想动手。。。动手。。。手。。。


好吧, 客户大人任性,于是一个工单就到了我们应用运维小伙伴手里,小伙伴一愣(不超过三秒),打开了 Postman

故事纯属虚构,只是为了说明什么是非标操作
要和API打交道,肯定少不了 Postman

它(需翻墙) 是Chrome浏览器的一个App,大概长这样:


Chrome Postman 界面)

或者更复杂一点的,支持 API 编排,用 Paw – The most advanced HTTP client for Mac,它大概长这样:


(Paw 界面)


大部分非标操作, Postman 是可以搞定的,但是非标操作本身是不提倡通过它来做的,首先它未过权鉴系统,然后它是一次性的,操作时间,操作人,操作结果都不能保留,导致操作与工单之间的关系无处可查,是有隐患的,而且有些需要签名的 API 更是力不从心,于是有了它:

内网 Postman

(名字形象吧,同事帮我起的 ^ ^)

先上特性:

  1. 有权鉴,模块化公司内部 API 的调用逻辑,根据不同 API 自动签名
  2. 自定义,包括:API 类型,API 方法,包含参数
  3. 有审计,不管成功失败,只要 API request 发送出去,就会产生一条历史记录,以备审计
  4. 最重要的,可以自动生成前端表单(Form)(这个很关键啊!?)

直接上图:






但是这还不够,我需要把定义好的 API API化,(有点拗),使用它分分钟搞定:


http://www.django-rest-framework.org/


直接上伪代码:

一个定义好的 API 的描述大概是这样:


{ "id": 3, "_params": [ { "param_name": "xxxId", "param_desc": "xxx ID", "create_date": "2017-03-07T10:51:11Z", "api_id": 3, "modify_date": "2017-03-07T10:51:11Z", "id": 1 } ], "create_date": "2017-03-07T09:45:42Z", "modify_date": "2017-03-07T10:25:31Z", "api_name": "查询xxx信息", "api_method": "GET", "api_desc": "", "api_group": "", "api_backend": "", "api_action": "Acxxxxxnfo", "api_type": { "id": 1, "create_date": "2017-03-07T08:26:28Z", "modify_date": "2017-03-07T08:52:55Z", "type_url": "http://xxx.ucloud.cn", "type_desc": "需要签名" }}

(无参数的 API)
(有参数的 API)

比较简单,主要用到了:

VueJS + element UI + axios + normalize.css + lodash

关键代码大概是这样:

<!-- 动态表单 --><template v-for="(item, index) in params"> <el-form-item :label="`${item.param_desc}`"> <el-input v-model="paramsForm[item.param_name]"></el-input> </el-form-item></template>
其实这里改进的空间很大,我可在定义表结构的时候为参数加上类型,比如:
<!-- 单选 --><el-form-item v-if="item.param_type === choice"> <choice-template></choice-template></el-form-item><!-- 时间选择器 --><el-form-item v-if="item.param_type === datetime"> <datetime-template></datetime-template></el-form-item>// 尽情发挥这个App的后端代码大概是这样:

# 发请求if api_queryset.api_method.upper() == 'GET': r = requests.get(url=url, params=payload)elif api_queryset.api_method.upper() == 'POST': r = requests.post(url=url, json=payload)else: r = { 'RetCode': -1, 'Message': 'API method invalid.' }# 保存结果save_result(user_queryset=user, api_queryset=api_queryset, result=json.dumps(rt), comment=comment, desc=u'备用字段')# 就像上面判断 method 一样,会先判断哪些 API 需要签名,哪些不需要,代码省略主要用到了:

Django + requests + djangorestframwork + MySQL

ORM 是 Django 自带,谁用谁知道


直接上生产:

整个项目前后端分离,VusJS build 的时候 static 路径配置为相对路径

大概是这样:

module.exports = { build: { env: require('./prod.env'), index: path.resolve(__dirname, '../dist/index.html'), assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', assetsPublicPath: '', <------ 看这里 productionSourceMap: true, bundleAnalyzerReport: process.env.npm_config_report }, dev: {}}构建完成的 dist 目录中的静态文件请求全部由 Nginx 处理,然后所有 API 交给uWSGI,可以部署两套,通过Nginx做简单的HA,前后端可以分开发布互不影响,开发花费的时间并不长,不到一天,思考比较费时间,一天半吧,还自己推翻了自己几次,但是能节省小伙伴不少时间

说到部署,不得不说一下开发环境与生产环境的切换问题了,我比较懒,开发环境与生产环境都在代码里写了,完全不用去改配置:

前端如何判断:

export let backendConf = { get url () { if (process.env.NODE_ENV === 'production') { return '/' } else { return 'http://127.0.0.1:8000/' } }}export let somethingElse = {}// ES6写法,定义 getter,像Python里面的 @property 装饰器装饰的方法,但是Python是同步的,JS是异步的,所以用法不同// process.env.NODE_ENV 会在build的时候被替换成 'production'// 使用的时候这样import { backendConf, somethingElse } from '../../Config'url = backendConf.urlse = somethingElseDjango 后端如何判断:

from django.conf import settingsfrom .app_settings import *if settings.DEBUG: global DEBUG DEBUG = True api = DEV_URLelse: api = PROD_URL# 附带一个小技巧,print 大法你懂得,我这个是不用删的那种,哈哈if DEBUG: print payload print req.url print req.json()这样的话,代码直接上线,什么都不用改

最后:

很遗憾,好多细节和技巧都没写出来,不过代码思路和思想应该比较清楚了,想到再补充吧,源代码不能放出来,有问题直接问我吧,先关注哦 ?

如果偏爱实战,可以看看我之前发过一篇文章:我如何使用 Django + Vue.js 快速构建项目

里面介绍了两个 Demo:

这次实战就是基于它们,嗯,其实已经高于它们了(懒真的能让人进步,真的)


如果本文对你有启发,可以持续关注

我 ( UCloud-中国最大的中立云计算服务商 DevOps )


或者我的专栏:随心DevOps - 本站专栏

本文地址:https://zhuanlan.zhihu.com/p/25654547/,转载请注明出处

关键词:打造,实战

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭