在进行SaaS开发时,面对如何对所有请求数据进行统一处理的需求,需要掌握中间件技术。如何将复杂的数据关系设计在DB中,需要掌握Django ORM中关联关系的技巧。如何对多条数据进行分页显示,需要掌握前后端数据交互。
题目
1. 实现“提交”功能。 a>根据选择的主机、业务和脚本数据,发送请求到执行脚本接口。 b>建立执行信息表,将任务执行信息存入该表。 c>调用作业平台的fast_execute_script接口执行该脚本, 将该功能实现后,上线到生产环境。 |
过程
渲染出执行脚本内容
上次完成了主机和业务信息的渲染,这次将脚本信息也通过接口得到。在文档中查看,调用通过client.job.get_script_list()实现
name 'false' is not defined 'Business does not exist'
查看上篇获取到的业务信息
2,3,5,6是存在的
尝试2,5,6皆是The user does not have permission to use this Business
而3是有内容的。通过观察result格式取出需要信息
TypeError: cannot unpack non-iterable int object
对于字典类型的info,通过调用info.items()转换为列表
渲染到页面
通过JavaScript得到当前选择的信息
标签
之前已在选择框的标签中添加id,则可以通过选择器得到当前选项的id号,如下,即使用$(“select[id=’select_server’]”).val()
<select name="select_server" id="select_server" class="form-control">
{% for server in servers %}
<option id="server_option" value={{server.id}}>{{server.ip}}</option>
{% endfor %}
</select>
获取select的option值及其文本
当点击提交按钮时,console输出信息
$("#submit").click(function () {
var biz=$("select[id='select_biz']").find("option:selected").text()
var server=$("select[id='select_server']").find("option:selected").text()
var script=$("select[id='select_script']").find("option:selected").text()
console.log('biz:'+biz)
console.log('server:'+server)
console.log('script:'+script)
}
获取选择框有效的主机
$(document).on('change','input:checkbox',function () {
$('input:checkbox:checked').each(function () {});
var existed=false;
for(i in serverids){
if(serverids[i]==$(this).val()){
console.log(serverids[i]+'exist')
existed=true
delete serverids[i]
}
}
if(existed==false)
{
serverids.push($(this).val());
}
console.log(serverids);
});
建表保存执行记录
SyntaxError: invalid character in identifier
注意中文的括号和英文的括号
获取表中数据
通过调试,object.all()返回的query类型的列表,
TypeError: context must be a dict rather than QuerySet.
传入给render的参数必须是dict类型,那把参数用dict()强制类型转换呢?
TypeError: cannot convert dictionary update sequence element #0 to a sequence
转换失败,其实是通过构造字典传入。键值表示要遍历的那个名称,值则是遍历的内容
data={'record':record}#构造一个dict
return render(request,'home_application/record.html',data)#传入即可
渲染成功
添加记录
将通过JavaScript得到当前选择的信息用异步请求ajax在数据表中新增数据,查看文档获取用户登录信息得到获取当前用户名的API调用方法。
def getuser():
client = get_client_by_user('USERNAME')
kwargs = {'bk_id': 1,
'bk_app_code':'APP_CODE',
'bk_app_secret':'xxxxxxxx',
'bk_token':'xxxxxxxxx',
}
result=client.bk_login.get_user(kwargs)
if result.get('result',True):
username=result['data']['bk_username']
return username
def addrecord(request):
username=getuser()
try:
biz_name=request.POST.get("biz")
server_name=request.POST.get("server")
script_name=request.POST.get("script")
print(biz_name,server_name,script_name)
#pdb.set_trace()
records.objects.create(biz_name=biz_name,
username=username,
server_name=server_name,
script_name=script_name)
response={"success":True}
except:
response={"success":False}
return HttpResponse(response)
执行脚本
最后一步就是实际操作,调用执行脚本接口
def execScript(bk_biz_id,script_id,username,server_ip):
client = get_client_by_user(user)
kwargs = {
'bk_id': 1,
'bk_app_code':'APP_CODE',
'bk_app_secret':'xxxxxx',
'bk_token':'xxxxxx',
"bk_biz_id": bk_biz_id,
"script_id": script_id,
"script_param": "aGVsbG8=",
"script_timeout": 1000,
#这里的account如果设为当前用户,可能会因没有权限而失败,可以改为默认的"root"
"account": username,#"root",
"is_param_sensitive": 0,
"script_type": 1,
"ip_list": [
{
"bk_cloud_id": 0,
"ip": server_ip #"10.0.2.7"
},
],
"custom_query_id": [
"3"
]
}
提示框
未勾选主机时
没有ip,通过ips.length==0判断并弹出提示
仿照教程的操作成功提示
ReferenceError: dialog is not defined at Object.success
需要将包含dialog的JavaScript源写入头部
<link href="https://magicbox.bk.tencent.com/static_api/v3/bk/css/bk.css" rel="stylesheet">
<link href="https://magicbox.bk.tencent.com/static_api/v3/assets/artDialog-6.0.4/css/ui-dialog.css" rel="stylesheet">
<script src="https://magicbox.bk.tencent.com/static_api/v3/assets/js/jquery-1.10.2.min.js"></script>
<script src="https://magicbox.bk.tencent.com/static_api/v3/assets/artDialog-6.0.4/dist/dialog-min.js"></script>
选择题
蓝鲸APP调用ESB组件方式包括*多选
不调用ESB组件,直接调用第三方系统API
APP不能调用ESB组件
使用APP开发框架中提供的ESB组件SDK包
根据ESB组件API地址直接访问
蓝鲸APP调用ESB组件的鉴权方式
用户认证与应用认证
关于 Django 开发安全,以下说法正确的是*多选
修改数据的表单开启 CSRF 保护
返回给 JavaScript 使用的数据先进行 JSON 编码
在生产环境下关闭 DEBUG 模式
修改默认的 Admin URL
以防被别有用心的人很容易就猜到
以下命令可以通过Django的Migrations文件生成SQL文件?*
django-admin migratesql migration_name app_label
python manage.py migratesql app_label migration_name
django-admin sqlmigrate migration_name app_label
python manage.py sqlmigrate app_label migration_name
下面哪些是 Django 字段查找中的合法操作符?*多选
iexact
lte
exact
istartswith
解答:
iexact 不区分大小写
lte 小于等于
exact 全等
istartswith 以……开始
django数据字段查询