蓝鲸实践作业——Django基础(三)

在进行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

注意中文的括号和英文的括号

注册到admin
添加一条测试数据

获取表中数据

通过调试,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"
                    ]
                }
root执行会成功
自己的登录提示失败

提示框

未勾选主机时

没有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 安全最佳实践

以下命令可以通过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数据字段查询

Leave a comment

Your email address will not be published. Required fields are marked *