我的python学习--第十二天(一)

一、CMDB中关联表之间数据的渲染

  1. 如何将关联表中的id在渲染时显示为name(查)
  2. 添加关联表数据时,如何渲染下拉菜单(增)
  3. 更新数据时,如何渲染下拉菜单并显示当前数据(改)

1.1、将id渲染为name

fields_cabinet=[‘id‘,‘name‘,‘idc_id‘,‘u_num‘,‘power‘]
fields_idc=[‘id‘,‘name‘]

@app.route(‘/cabinet/‘)
def cabinet():
    if not session.get(‘name‘):
        return render_template(‘login.html‘)                                                                                                              
    role = session.get(‘role‘)
    # 通过db文件中的list函数将机柜表中的所有数据查找出来
    cabinets = db.list(‘cabinet‘,fields_cabinet)
    for i in cabinets:
        # 通过单个机柜中的‘idc_id‘获取与之对应的单个机房的信息
        idc = db.list(‘idc‘,fields_idc,i[‘idc_id‘])
        # 将机柜的‘idc_id‘改为机房名
        i[‘idc_id‘] = idc[‘name‘]

    return render_template("cabinetlist.html",cabinets = cabinets)

2.1、渲染下拉菜单(jinja2方法)

前端代码:

<select id=‘idc_id‘ class=‘multiselect dropdown-togglebtn btn-default‘>
<!-- idcs为机房表中的所有信息,从中获取idc并逐个渲染 -->
{% for idc in idcs %}           
    <option value="{{ idc.id }}">{{ idc.name }}</option>
{% endfor %}                     
</select>

逻辑端代码:

@app.route(‘/cabinetadd‘,methods = [‘GET‘,‘POST‘])
def cabinetadd():
    if not session.get(‘username‘,None):
        return redirect("/login")
        
    if request.method == ‘GET‘:
        # 获取机房表的数据传给前端
        data = db.list(‘idc‘,fields_idc)
        return  render_template(‘cabinetadd.html‘,idcs=data)
    else:
        ... ...

2.2、渲染下拉菜单(jquery方法)

前端html代码:

<!-- 一个空的select -->
<select id=‘idc_id‘ class=‘multiselect dropdown-toggle btn btn-default‘>
</select>

js代码:

var str = ‘‘
$.getJSON(‘/idc_msg‘,function(data){
    idcs = data[‘result‘]
    for(var i=0;i<idcs.length;i++){
    // 通过拼字符串的方法获取所有的option
    str += ‘<option value="‘+idcs[i][‘id‘]+‘">‘+idcs[i][‘name‘]+‘</option>‘
    // 对‘idc_id‘添加数据
    $(‘#idc_id‘).html(str)
    }

逻辑端代码:

@app.route(‘/idc_msg/‘)
def idc_msg():
    if not session.get(‘name‘):
        return render_template(‘login.html‘)
        
    # 获取idc表中的数据
    idcs = db.list(‘idc‘,fields_idc)
    return json.dumps({‘result‘:idcs})

3.1、渲染下拉菜单,并显示当前数据(jinja2方法)

前端代码:

<select id=‘idc_id‘ class=‘multiselect dropdown-toggle btn btn-default‘>
{% for idc in  idcs %}
    <!-- 通过idc表中的数据对option进行渲染,将单个cabinet的‘idc_id‘与渲染好的option对比,
     相同就选中,否则不作操作 -->
    {% if cabinet.idc_id == idc.id %}
     <option  value="{{ idc.id }}" selected="selected">{{ idc.name }}</option>
    {% else %}
     <option  value="{{ idc.id }}" >{{ idc.name }}</option>
    {% endif %}
{% endfor %}
</select>

逻辑端代码:

@app.route(‘/cabinetupdate‘,methods=[‘GET‘,‘POST‘])
def cabinet_update():
    ... ...
    ... ...
    if request.method == ‘GET‘:
        # 从list页面跳转到update页面是会传递单条数据的‘id‘
        id = request.args.get(‘id‘ )
        # 单个机柜数据
        cabinet = db.list(‘cabinet‘,fields,id)
        # 所有的机房数据
        idcs = db.list(‘idc‘,idc_fields)   
        return render_template(‘cabinet/cabinetupdate.html‘,cabinet=cabinet,idcs=idcs)

3.2、渲染下拉菜单,并显示当前数据(jquery方法)

前端html代码:

<!-- 一个空的select -->
<select id=‘idc_id‘ class=‘multiselect dropdown-toggle btn btn-default‘>
</select>

前端js代码:

$(‘.update‘).click(function(){
    var id=$(this).attr(‘data-id‘)
    var url = "/cabinet_update_msg?id="+id
    var str = ‘‘
    
    // 从‘/idc_msg‘回调函数中获取所有的机房数据,拼接成option字符串,在select中显示
    $.getJSON(‘/idc_msg‘,function(data){
        idcs = data[‘result‘]
        for(var i=0;i<idcs.length;i++){
            str += ‘<option value="‘+idcs[i][‘id‘]+‘">‘+idcs[i][‘name‘]+‘</option>‘
            }
        $(‘#idc_id‘).html(str)

        // 从‘/cabinet_update_msg‘中获取单个机柜信息,并渲染
        $.getJSON(url,function(data){
            if (data[‘code‘] == 0){
                cabinet = data[‘result‘]
                $(‘#id‘).val(cabinet[‘id‘])
                $(‘#name‘).val(cabinet[‘name‘])
                // 当option中value与机柜的‘idc_id‘相同时,添加属性使其被选中
                $("#idc_id option[value=‘"+cabinet[‘idc_id‘]+"‘]").attr(‘selected‘,true)
                $(‘#u_num‘).val(cabinet[‘u_num‘])
                $(‘#power‘).val(cabinet[‘power‘])
            }else{
                $(‘#errmsg‘).html(‘fail‘)
            }
        })
    })
})

逻辑端数据:

# 获取所有机房信息
@app.route(‘/idc_msg/‘)
def idc_msg():
    if not session.get(‘name‘):
        return render_template(‘login.html‘)
    idcs = db.list(‘idc‘,fields_idc)
    return json.dumps({‘result‘:idcs})
# 获取单个机柜信息
@app.route(‘/cabinet_update_msg/‘)
def cabinet_update_msg():
    id = request.args.get(‘id‘)
    cabinet = db.list(‘cabinet‘,fields_cabinet,id)
    return json.dumps({‘code‘:0,‘result‘:cabinet})


Flask配置文件管理

Flask有一个内置的全局字典app.config,使用这个全局字典进行管理

1、直接配置(不推荐使用)

In [1]: from flask import Flask

In [2]: app = Flask(__name__)

# 直接通过字典的方式进行赋值
In [3]: app.config[‘host‘] = ‘localhost‘

In [4]: app.config.get(‘host‘)
Out[4]: ‘localhost‘

2、通过环境变量加载配置

[[email protected] day_12]# tail config.py 
# 配置键必须为大写字母,否则无效
HOST = ‘localhost‘

[[email protected] day_12]# export CONFIG_SET=/data/python/day_12/config.py
... ...

In [3]: app.config.from_envvar(‘CONFIG_SET‘)           # 从全局变量中读取文件中的数据
Out[3]: True

In [4]: app.config.get(‘HOST‘)
Out[4]: ‘localhost‘

3、通过对象加载(推荐使用)

[[email protected] day_12]# cat config2.py 
class DevelopmentConfig():
    SQLALCHEMY_DATABASE_URI=‘mysql://wd:[email protected]/test‘

class ProductionConfig():
    SQLALCHEMY_DATABASE_URI=‘mysql://wd:[email protected]/devops‘

# 将类写成字典的形式存储
config = {
    ‘dev‘ : DevelopmentConfig,
    ‘pro‘ : ProductionConfig,
    ‘default‘ : DevelopmentConfig
}
... ...
In [3]: from config2 import *

In [4]: app.config.from_object(‘DevelopmentConfig‘)    # 方法一,直接获取对象中定于类

In [5]: app.config.get(‘SQLALCHEMY_DATABASE_URI‘) 
Out[5]: ‘mysql://wd:[email protected]/test‘

In [6]: app.config.from_object(config[‘pro‘])          # 方法二,通过获取对象中字典定义的类,效果同上

In [7]: app.config.get(‘SQLALCHEMY_DATABASE_URI‘)
Out[7]: ‘mysql://wd:[email protected]/devops‘

4、通过配置文件

[[email protected] day_12]# tail config.py                 
HOST = ‘localhost‘
... ...

In [3]: app.config.from_pyfile(‘config.py‘)     # config.py必须与执行文件在同一目录
Out[3]: True

In [4]: app.config.get(‘HOST‘)
Out[4]: ‘localhost‘

5、通过python的ConfigParse模块

In [1]: cat config.py                           # 通过[]对配置文件进行分组,config.py可以在任意位置
[test]                                          # section
port = 1111                                     # option
path = /data/test/log

[web]
port = 1112
path = /data/web/log
 
In [2]: import ConfigParser
 
In [3]: cf = ConfigParser.ConfigParser()    # 实例化一个对象
 
In [4]: cf.read(‘config.py‘)                # 读取文件所有内容
Out[4]: [‘config.py‘]
 
In [5]: host1 = cf.get(‘info‘,‘host‘)       # 通过get(‘section‘,‘option‘)来获取数据
 
In [6]: host2 = cf.get(‘test‘,‘host‘)
 
In [7]: print host1,host2
‘localhost‘ ‘127.0.0.1‘

# 其他用法
In [8]: cf.sections()                       # 获取所有的section
Out[8]: [‘test‘, ‘web‘]

In [9]: cf.items(‘test‘)                    # 通过section获取所有的option
Out[9]: [(‘port‘, ‘1111‘), (‘path‘, ‘/data/test/log‘)]

In [10]: cf.add_section(‘development‘)      # 添加section

In [11]: cf.set(‘development‘,‘port‘,1113)  # 设置section中的option

In [12]: cf.set(‘development‘,‘path‘,‘/data/development/log‘)

In [13]: fo = open(‘config.py‘,‘w‘)         # 打开config.py配置文件

In [14]: cf.write(fo)                       # 将新的section写入

In [15]: fo.close()

In [16]: cat config.py                      # 显示新配置已经写入
[test]
port = 1111
path = /data/test/log

[web]
port = 1112
path = /data/web/log

[development]
port = 1113
path = /data/development/log
时间: 2024-08-16 12:19:31

我的python学习--第十二天(一)的相关文章

据廖雪峰python3教程----python学习第十二天

使用模块 Python本身就内置了很多非常有用的模块,只要安装安装完毕,这些模块就可以立刻使用. 我们以内建的 sys 模块为例,编写一个 hello 的模块: 'a test module'      # 一个字符串表示文档注释,任何模块代码的第一个字符串都被视为模块的文档注释 __author__='xiaoming'   #作者名 可以删除 上面的也可以不要 import sys                    #导入 sys 模块 def test():     args = sy

python学习第二十二天文件byte类型

所有的文件在计算机里面存储为二进制形式,但是我们有时候有需要将二进制转换为gbk或者utf-8形式,编码的时候encode 解码的时候decode ,下面简单阐述python二进制在文件传输过程的作用. 1,python哪些格式二进制传输 视频,图片,音乐 2,python文件二进制的作用 在网络编程的过程中,在网络传输过程中,不希望人家看到编码的,可以用二进制传输,速度快,安全,可靠. 3,python文件的二进制用法 rb,二进制读模式 wb,二进制写模式 ab,二进制写追加模式 文章来自(

python学习第十二天:闭包函数与装饰器

闭包函数: 什么是闭包函数: 闭指的是定义在一个函数内部 包指的是该函数包含对外部作用域(非全局作用域)名字的引用 def counter(): n=0 def incr(): nonlocal n x=n n+=1 return x return incr c=counter() print(c()) 闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域 装饰器 1.什么是装饰器 就目前来看:装饰器就是定义一

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令

python学习之最简单的用户注册及登录验证小程序

文章都是从我的个人博客上粘贴过来的哦,更多内容请点击 http://www.iwangzheng.com 正如很多同学所知道的,楼主开始学习python了,前进的道路曲曲折折,有荆棘也有陷阱,从最简单的小程序写起,每天练习,将python进行到底. 有一点比较别扭的就是python的换行之后空四个空格,ruby都是两个,并且python在方法和循环语句的第一句都要加冒号 mysql> show create table user; mysql> alter table user add sal

python学习--创建模块

昨天做了python客户端和服务器端通信,并把接收到的信息写到数据库,因为对数据库进行操作是个经常调用的行为,所以我想把调用数据库的操作写成一个module来给其它python程序调用,所以将昨天的服务器端程序拆分为两个文件: 1.主程序python.py #!/usr/bin/env python import socket import json import connmysql s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) h

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho