时间:2023-07-21 01:27:02 | 来源:网站运营
时间:2023-07-21 01:27:02 来源:网站运营
【实战】Django + VueJS 打造内网 Postman:就和你们看到 内网Postman 是懵逼的一样,我接到一个叫非标操作的需求时候我也是懵逼的
故事纯属虚构,只是为了说明什么是非标操作要和API打交道,肯定少不了 Postman
大部分非标操作, Postman 是可以搞定的,但是非标操作本身是不提倡通过它来做的,首先它未过权鉴系统,然后它是一次性的,操作时间,操作人,操作结果都不能保留,导致操作与工单之间的关系无处可查,是有隐患的,而且有些需要签名的 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": "需要签名" }}
<!-- 动态表单 --><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 自带,谁用谁知道
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 = somethingElse
Django 后端如何判断: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()
这样的话,代码直接上线,什么都不用改关键词:打造,实战