• python学习笔记


    参照地址:
    
    http://www.cnblogs.com/wupeiqi/articles/5237704.html
    
    
    1、格式化输出
    
    name=input("name")
    age =int( input("age: ") )
    job=input("job")
    salary = input("salary: ")
    
    info = '''
    
    ---------------------  info of   ---------------------------
    
    name = %s
    
    age = %d
    
    job = %s
    
    salary = %s
    
    ''' %(name, age,job, salary)
    
    print(info)
    
    
    
    name=input("name")
    age =int( input("age: ") )
    job=input("job")
    salary = input("salary: ")
    
    info2 = '''
    -----------------info of _name --------------
    
    name = {_name}
    
    age = (_age)
    
    job = {_salary}
    
    salary = {_job}
    
    '''.format(_name=name,
                _age=age,
                _salary=job,
                _job=salary)
    
    print(info2)
    
    
    
    
    2、if语句
    
    age = 45
    guest_age=int(input("guest_age1:"))
    if guest_age > age:
        print ("guest smaller")
    elif guest_age == age:
        print("right")
    else:
        print("guest bigger")
    
    
    
    3、while:
    
    
    count=0
    while True:
        if count==3:
            break
        age = 45
        guest_age=int(input("guest_age1:"))
        if guest_age > age:
            print ("guest smaller")
        elif guest_age == age:
            print("right")
            break
        else:
            print("guest bigger")
        count+=1
    
    
    
    count=0
    while count<3:
    
        age = 45
        guest_age=int(input("guest_age1:"))
        if guest_age > age:
            print ("guest smaller")
        elif guest_age == age:
            print("right")
            break
        else:
            print("guest bigger")
        count+=1
    else:
        print("you have try too many times")
    
    
    
    4、for 循环
    
    
    count=0
    for i in range(3):
    
        age = 45
        guest_age=int(input("guest_age1:"))
        if guest_age > age:
            print ("guest smaller")
        elif guest_age == age:
            print("right")
            break
        else:
            print("guest bigger")
    
    else:
        print("you have try too many times")
    
    
    
    count=0
    while count<3:
    
        age = 45
        guest_age=int(input("guest_age1:"))
        if guest_age > age:
            print ("guest smaller")
        elif guest_age == age:
            print("right")
            break
        else:
            print("guest bigger")
        count+=1
        if count == 3:
            continue_count=input("if you wang to contue:")
            if continue_count != "n":
                count=0
    else:
        print("you have try too many times")
    
    
    5、continue:
    
    
    for i in range(0,6):
        if i < 3 :
            print("i:",i)
        else:
            continue
        print("ni hao")
    
    
    
    
    6、模块
    
    
    import sys
    print (sys.path)
    
    
    
    7、三元运算
    
    
    
    a=1
    b=2
    c=3
    d=a if a>b else c
    print(d)
    
    
    
    8、列表使用
    
    增 删 改 减
    
    
    
    a=[('digit',2),('fruit','apple')]
    print(a)
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    [('digit', 2), ('fruit', 'apple')]
    
    
    
    xing=["li","zhu","song","he","#"]
    number=["1","2","3"]
    print(xing)
    
    print(xing[2])
    print(xing[2:])
    print(xing[-3:-1])
    xing.insert(1,"zhao")
    xing.extend(number)
    del xing[1]
    xing.reverse()
    
    xing2=xing.copy()
    print(xing,xing2)
    
    
    
    xing=["li","zhu","song","he","#"]
    xing[1]="zhao"
    print(xing)
    
    
    
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=xing.copy()
    xing[3][0]="zhao"
    print(xing)
    print(xing2)
    
    
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=xing.copy()
    xing[3]="zhao"
    print(xing)
    print(xing2)
    
    
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=xing.copy()
    
    xing2[3][0]="zhao"
    print(xing)
    print(xing2)
    
    
    
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    print(xing)
    print(xing2)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['li', 'zhu', 'song', ['zhao', 'hong'], 'he', '#']
    ['li', 'zhu', 'song', ['sun', 'hong'], 'he', '#']
    
    Process finished with exit code 0
    
    
    9、复制:
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    for i in xing:
        print(i)
    
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    list=xing[0:-1:2]
    for i in list:
        print(i)
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    list=xing[::2]
    for i in list:
        print(i)
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    print(xing[::2])
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['li', 'song', 'he']
    
    Process finished with exit code 0
    
    
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    print(xing[:])
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['li', 'zhu', 'song', ['zhao', 'hong'], 'he', '#']
    
    Process finished with exit code 0
    
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    print(xing[:-1])
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['li', 'zhu', 'song', ['zhao', 'hong'], 'he', '#']
    
    Process finished with exit code 0
    
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    print(xing[0:3])
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['li', 'zhu', 'song']
    
    Process finished with exit code 0
    
    
    
    
    
    import copy
    xing=["li","zhu","song",["sun","hong"],"he","#"]
    xing2=copy.deepcopy(xing)
    xing[3][0]="zhao"
    print(xing[:3])
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['li', 'zhu', 'song']
    
    Process finished with exit code 0
    
    
    
    浅copy的作用 :使用于夫妻存款、取款等
    
    
    import copy
    person=["name",["alice",100]]
    a1=copy.copy(person)
    a2=person[:]
    a3=list(person)
    print(a1)
    print(a2)
    print(a3)
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['name', ['alice', 100]]
    ['name', ['alice', 100]]
    ['name', ['alice', 100]]
    
    
    
    import copy
    person=["alice",["saving",100]]
    a1=copy.copy(person)
    person[0]="feng jie"
    person[1][1]=50
    print(person)
    print(a1)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    ['feng jie', ['saving', 50]]
    ['alice', ['saving', 50]]
    
    Process finished with exit code 0
    
    
    10、购物车
    
    
    product_list=[("apple",100),("banana",50),("fone",600)]
    salary=input("please input your salary:")
    shoping_list=[]
    if salary.isdigit():
        salary=int(salary)
        while True:
            for index,item in enumerate(product_list):
                print(index,item)
            user_choice=input("your choice:")
            if user_choice.isdigit():
                user_choice=int(user_choice)
                if user_choice < len(product_list) and user_choice > 0:
                    p_item=product_list[user_choice]
                    if p_item[1] < salary:
    
                        shoping_list.append(p_item)
                        salary-=p_item[1]
                        print("%s has been add your shoping_list,your salary_list is 33[31;1m%s33[0m" % (p_item,salary))
                    else :
                        print ("33[31;1mmoney is just %s ,not to buy33[0m" % salary )
            elif user_choice == "q":
                print("-----------shoping_list_______")
                for p in shoping_list:
                    print(p)
                    print("%s dollars is lift" % salary)
                    exit()
            else:
                print("your choice is worng")
    
    11、字符串
    
    
    str="my name is  stone"
    print(str[str.find("name"):])
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    name is  stone
    
    Process finished with exit code 0
    
    str="my name is  {name},my hometown is {it} "
    print(str.format(name="stone",it="hebei"))
    print(str.format_map( {'name':'stone','it':'hebei'} ))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    my name is  stone,my hometown is hebei 
    my name is  stone,my hometown is hebei 
    
    Process finished with exit code 0
    
    
    
    print('-'.join(['1','2','3']))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1-2-3
    
    Process finished with exit code 0
    
    
    
    
    12、字典
    
    
    列表转换字典    元组()里面可以包含多个列表, 列表里面也可以包含多个元组
    
    
    a=dict.fromkeys([1],[3])
    print(a)
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1: [3]}
    
    
    a=dict.fromkeys([1,2],[3,{'name':'alice'}])
    print(a)
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1: [3, {'name': 'alice'}], 2: [3, {'name': 'alice'}]}
    
    
    
    字典转换成列表
    
    
    str={1:'zhu',2:'li',3:'song'}
    print(str.items())
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    dict_items([(1, 'zhu'), (2, 'li'), (3, 'song')])
    
    
    删除
    
    info={
        1:'zhu',
        2:'li',
        3:'song'
    }
    del info[1]
    print(info)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {2: 'li', 3: 'song'}
    
    
    随机删除
    
    info={
        1:'zhu',
        2:'li',
        3:'song'
    }
    info.popitem()
    print(info)
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {2: 'li', 3: 'song'}
    
    
    
    修改
    
    
    info={
        1:'zhu',
        2:'li',
        3:'song'
    }
    info[1]="sun"
    print(info)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1: 'sun', 2: 'li', 3: 'song'}
    
    
    
    
    
    增加        
    info={
        1:'zhu',
        2:'li',
        3:'song'
    }
    info[4]="sun"
    print(info)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1: 'zhu', 2: 'li', 3: 'song', 4: 'sun'}
    
    
    
    查找
    
    
    info={
        1:'zhu',
        2:'li',
        3:'song'
    }
    
    print(info.get(1))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    zhu
    
    
    
    
    
    多级嵌套
    
    
    info={
        "china":["name","xiao hua"],
        "France":["name","xiao gang"]
    }
    
    print(info)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'china': ['name', 'xiao hua'], 'France': ['name', 'xiao gang']}
    
    
    修改
    
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    info["china"]["shang hai"][1]= "xiao li"
    print(info)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'France': {'bei jing': ['name', 'xiao gang']}, 'china': {'shang hai': ['name', 'xiao li']}}
    
    
    重新赋值
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    print(info)
    info.setdefault("american",{"bai gong":["name","bob"]})
    
    print(info)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'France': {'bei jing': ['name', 'xiao gang']}, 'china': {'shang hai': ['name', 'xiao hua']}}
    {'France': {'bei jing': ['name', 'xiao gang']}, 'american': {'bai gong': ['name', 'bob']}, 'china': {'shang hai': ['name', 'xiao hua']}}
    
    
    
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    print(info)
    info.setdefault("china",{"bai gong":["name","bob"]})
    
    print(info)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'china': {'shang hai': ['name', 'xiao hua']}, 'France': {'bei jing': ['name', 'xiao gang']}}
    {'china': {'shang hai': ['name', 'xiao hua']}, 'France': {'bei jing': ['name', 'xiao gang']}}
    
    
    更新
    
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    
    fruit={"china":"red",
           "banana":"yellow"
    }
    
    print(info)
    info.update(fruit)
    print(info)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'France': {'bei jing': ['name', 'xiao gang']}, 'china': {'shang hai': ['name', 'xiao hua']}}
    {'France': {'bei jing': ['name', 'xiao gang']}, 'banana': 'yellow', 'china': 'red'}
    
    
    
    字典转换列表
    
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    
    fruit={"china":"red",
           "banana":"yellow"
    }
    
    print(info)
    
    print(info.items())
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'France': {'bei jing': ['name', 'xiao gang']}, 'china': {'shang hai': ['name', 'xiao hua']}}
    dict_items([('France', {'bei jing': ['name', 'xiao gang']}), ('china', {'shang hai': ['name', 'xiao hua']})])
    
    
    
    
    初始化
    
    
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    
    fruit={"china":"red",
           "banana":"yellow"
    }
    
    print(info)
    a=dict.fromkeys([1,2,3],"students")
    print(a)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'china': {'shang hai': ['name', 'xiao hua']}, 'France': {'bei jing': ['name', 'xiao gang']}}
    {1: 'students', 2: 'students', 3: 'students'}
    
    
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    
    
    print(info)
    a=dict.fromkeys([1,2,3],["students",{"math class teachet":"li ming"}])
    print(a)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'France': {'bei jing': ['name', 'xiao gang']}, 'china': {'shang hai': ['name', 'xiao hua']}}
    {1: ['students', {'math class teachet': 'li ming'}], 2: ['students', {'math class teachet': 'li ming'}], 3: ['students', {'math class teachet': 'li ming'}]}
    
    
    
    
    
    跟超链接一样
    
    
    info={
        "china": {
            "shang hai":["name","xiao hua"]
    },
        "France": {
            "bei jing":["name","xiao gang"]
    }
    }
    
    
    a=dict.fromkeys([1,2,3],[88,{"math class teachet":"li ming"},555])
    print(a)
    a[2][1]['math class teachet'] = "li feng"
    print(a)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1: [88, {'math class teachet': 'li ming'}, 555], 2: [88, {'math class teachet': 'li ming'}, 555], 3: [88, {'math class teachet': 'li ming'}, 555]}
    {1: [88, {'math class teachet': 'li feng'}, 555], 2: [88, {'math class teachet': 'li feng'}, 555], 3: [88, {'math class teachet': 'li feng'}, 555]}
    
    
    
    
    13、集合
    
    去重:
    
    
    list=[1,3,5,6,5,]
    list1=set(list)
    print(list1,type(list))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1, 3, 5, 6} <class 'list'>
    
    
    取交集
    
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,9])
    print( list2.intersection(list3))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1, 3}
    
    
    取并集
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,9])
    print( list2.union(list3))
    
    
    
    ist1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,7,8])
    print( list3 | list2)
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1, 3, 5, 6, 9}
    
    
    差集
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,9])
    print( list2.difference(list3))
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,7,8])
    print( list3 & list2)
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,7,8])
    print( list2 - list3)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {5, 6}
    
    
    子集
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,5])
    print( list3.issubset(list2))
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    True
    
    
    
    父集
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,5])
    print( list3.issuperset(list2))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    False
    
    
    
    对称差集
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,7,8])
    print( list3.symmetric_difference(list2))
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,7,8])
    print( list2 ^ list3)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {5, 6, 7, 8}
    
    
    
    集合添加
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,7,8])
    list2.add(9)
    print(list2)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {1, 9, 3, 5, 6}
    
    
    
    
    list1=[1,3,5,6,5,]
    list2=set(list1)
    list3=set([1,3,7,8])
    list2.update([9,0,8])
    print(list2)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {0, 1, 3, 5, 6, 8, 9}
    
    
    
    
    14 文件编辑
    
    
    打开文件、
    
    
    data=open("zabbix.txt",encoding="utg-8").read()
    
    print(data)
    
    
    
    
    
    读文件:
    
    
    f=open("zabbix.txt",'r',encoding="utg-8")
    data=f.read()
    print(data)
    
    
    
    写文件:会覆盖
    
    
    
    f=open("zabbix.txt",'w',encoding="utf-8")
    f.write("good moring")
    f.write("hello boy")
    
    
    追加
    
    
    f=open("zabbix.txt",'a',encoding="utf-8")
    f.write("
    good moring
    ")
    f.write("hello boy")
    f.close()
    
    
    
    读前5行
    
    
    f=open("zabbix.txt",'r',encoding="utf-8")
    for i in range(5):
        print(f.readline())
    
    
    正规打印循环打印每一行    --列表 -删除空格
    
    
    f=open("zabbix.txt",'r',encoding="utf-8")
    for line in f
        print(line)
    
    
    
    不要用下面的方式
    
    到第10行不打印  ---这种readline容易把内存卡爆,用下面的循环,往内存里面读一行,删除一行。
    
    
    f=open("zabbix.txt",'r',encoding="utf-8")
    for index,line in enumerate(f.readline()):
        if index==10:
            print("-------wait a minute----")
            continue
        print(line.strip())
    
    
    
    正规打印循环打印每一行
    f=open("zabbix.txt",'r',encoding="utf-8")
    for line in f
        print(line)
    
    f=open("zabbix.txt",'r',encoding="utf-8")
    count=0
    for line in f:
        if count==9:
            print("-------wait a minute----")
            continue
        print(line)
        count+=1
    
    
    
    读新旧文件往新文件里面写:---推荐这种适合3个G的大文件。不占内存。
    
    
    f=open("zabbix.txt",'r',encoding="utf-8")
    f_new=open("zabbix2.txt",'w',encoding="utf-8")
    for line in f:
        if "good moring" in line:
            line=line.replace("good moring","good moring")
        f_new.write(line)
    f.close()
    
    
    
    经典写入格式:
    
    with open('zabbix.txt','a') as f:
        f.write("hello world")
    
    
    
    15 函数:
    
    函数与面向过程其实没啥区别,
    
    
    
    函数返回值:
    
    
    def func():
        print("hello word")
        return 0
    a=func()
    print(a)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    hello word
    0
    
    
    返回元组
    
    
    def func():
        print("hello word")
        return 'a',[33],{'c':'66'}
    a=func()
    print(a)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    hello word
    ('a', [33], {'c': '66'})
    
    
    
    
    
    没有返回值
    
    
    
    def func():
        print("hello word")
    
    a=func()
    print(a)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    hello word
    None
    
    
    
    
    
    传递参数
    
    位置参数
    
    def func(a,b):
        print(a)
        print(b)
        
    func(1,2)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    2
    
    
    关键字参数
    
    
    def func(a,b):
        print(a)
        print(b)
    
    func(a=1,b=2)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    2
    
    
    
    
    def func(a,b):
        print(a)
        print(b)
    x=1
    y=2
    func(a=x,b=y)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    2
    
    
    
    def func(a,b):
        print(a)
        print(b)
    
    func(b=2,a=1)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    2
    
    
    
    def func(a,b,c):
        print(a)
        print(b)
        print(c)
    func(1,c=3,b=2)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    2
    3
    
    
    
    默认参数
    
    
    def func(a,b,c=3):
        print(a)
        print(b)
        print(c)
    func(a=1,b=2)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    2
    3
    
    
    
    def func(a,b,c=3):
        print(a)
        print(b)
        print(c)
    func(a=1,b=2,c=5)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    2
    5
    
    
    
    *args
    
    
    def func(a,*args):
        print(a)
        print(args)
        
    func(1)
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    ()
    
    
    
    def func(a,*args):
        print(a)
        print(args)
    
    func(1,3,4,5)
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    (3, 4, 5)
    
    
    
    
    
    **kwargs
    
    
    def func(a,**kwargs):
        print(a)
        print(kwargs)
    
    func(1,name='bob')
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    {'name': 'bob'}
    
    
    
    
    
    def func(a,*args,**kwargs):
        print(a)
        print(args)
        print(kwargs)
    
    func(1,name='bob')
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    ()
    {'name': 'bob'}
    
    
    
    
    def func(a,*args,**kwargs):
        print(a)
        print(args)
        print(kwargs)
    
    func(1,3,name='bob')
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    (3,)
    {'name': 'bob'}
    
    
    
    
    def func(a,*args,**kwargs):
        print(a)
        print(args)
        print(kwargs)
    
    func(1,*[1,2,3,4,])
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    (1, 2, 3, 4)
    {}
    
    
    
    16 局部变量:  变量只在函数里面生效
    
    
    
    def func(a,*args,**kwargs):
        print(a)
        print(args)
        print(kwargs)
        cpu("%53")
    def cpu(value):
        print("the cup is  %s" % value)
    func(1,*[1,2,3,4,])
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    (1, 2, 3, 4)
    {}
    the cup is  %53
    
    
    
    
    
    def func(a,*args,**kwargs):
        print(a)
        print(args)
        print(kwargs)
        cpu("%53")
    
    func(1,*[1,2,3,4,])
    def cpu(value):
        print("the cup is  %s" % value)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py", line 7, in <module>
        func(1,*[1,2,3,4,])
      File "C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py", line 5, in func
        cpu("%53")
    NameError: name 'cpu' is not defined
    (1, 2, 3, 4)
    {}
    
    
    def change_data(data):
        print("before data",data)
        data=55
        print("last data",data)
    
    data=22
    change_data(data)
    print(data)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    before data 22
    last data 55
    22
    
    
    
    
    全局变量
    
    
    color="green"
    def change_data(data):
        print("before data",data,color)
        data=55
        print("last data",data)
    
    data=22
    change_data(data)
    print(data)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    before data 22 green
    last data 55
    22
    
    
    
    
    
    color="green"
    def change_data(data):
        color="blue"
        print("before data",data,color)
        data=55
        print("last data",data)
    
    data=22
    change_data(data)
    print(data)
    print(color)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    before data 22 blue
    last data 55
    22
    green
    
    
    下面这种情况 global 最好不要这么写,
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    before data 22 blue
    last data 55
    22
    color is blue
    
    
    
    
    递归 :在函数里面调用本次函数,必须要有个结束语;每次递归都要比上一次的数减小,否则就会成为死循环
    
    
    
    def count(n):
        print(n)
        if int(n)>0:
    
            return count(int(n/2))
        print(n)
    
    count(10)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    10
    5
    2
    1
    0
    
    
    
    
    匿名函数:
    
    
    
    calc=lambda x:x*5
    print(calc(3))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    15
    
    
    
    高阶函数 :参数里面换成函数
    
    
    字符串转换成函数:eval()
    
    
    
    
    
    
    
    
    
    
    
    
    
    17、装饰器   
    
    
    
    解释:是用来为其他函数添加附加功能的函数
    
    原则:
    1、不能动原来的函数代码
    2、不能动原来函数的调用方式
    
    
    函数就是变量
    
    3、高阶函数+嵌套函数=装饰器
    
    
    import time
    def timmer(func):
        def warpper():
            start_time=time.time()
            func()
            stop_time=time.time()
            print("in the func is %s" % (stop_time-start_time))
        return warpper
    
    def test():
        time.sleep(3)
        print("welcome to bejing")
    test=timmer(test)
    test()
    
    
    import time
    def timmer(func):
        def warpper(*args,**kwargs):
            start_time=time.time()
            func()
            stop_time=time.time()
            print("in the func is %s" % (stop_time-start_time))
        return warpper
    @timmer
    def test():
        time.sleep(3)
        print("welcome to bejing")
    test()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    welcome to bejing
    the actual run time is 3.0001721382141113
    
    
    
    不动原来的函数代码
    
    
    写两个函数,一个在上面 一个在下面   下面的函数调用上面的即可,但是动了函数的调用方式
    
    
    
    
    
    
    不动原来函数的调用方式 
    
    import time
    def bar():
        time.sleep(3)
        print("in the bar")
    def test2(func):
        #print(func)
        return func
    bar=test2(bar)
    bar()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    <function bar at 0x0067B198>
    in the bar
    
    
    
    函数嵌套:
    
    
    def foo():
        print("in the foo")
        def bar():
            print("in the bar")
        bar()
    foo()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the foo
    in the bar
    
    
    下面改变了函数调用方式
    
    import time
    def deco(func):
        start_time=time.time()
        func()
        stop_time=time.time()
        print("in the func run  is %s" % (stop_time-start_time))
        return deco
    
    def test1():
        time.sleep(3)
        print("in the test1")
    def test2():
        time.sleep(3)
        print("in the test2")
    deco(test1)
    deco(test2)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the test1
    in the func run  is 3.000171184539795
    in the test2
    in the func run  is 3.0001718997955322
    
    
    下面报错
    
    
    import time
    def deco(func):
        start_time=time.time()
        func()
        stop_time=time.time()
        print("in the func run  is %s" % (stop_time-start_time))
        return deco
    
    def test1():
        time.sleep(3)
        print("in the test1")
    def test2():
        time.sleep(3)
        print("in the test2")
    test1=deco(test1)
    test1()
    test2=deco(test2)
    test2()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the test1
    in the func run  is 3.000170946121216
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py", line 16, in <module>
        test1()
    TypeError: deco() missing 1 required positional argument: 'func'
    
    
    下面没有改变函数调用方式 但是没有添加功能
    
    
    import time
    def deco(func):
        start_time=time.time()
        return func
        stop_time=time.time()
        print("in the func run  is %s" % (stop_time-start_time))
        return deco
    
    def test1():
        time.sleep(3)
        print("in the test1")
    def test2():
        time.sleep(3)
        print("in the test2")
    test1=deco(test1)
    test1()
    test2=deco(test2)
    test2()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the test1
    in the test2
    
    
    
    完整的装饰器:
    
    
    
    import time
    def timmer(func):
        def deco():
            start_time=time.time()
            func()
            stop_time=time.time()
            print("in the func run  is %s" % (stop_time-start_time))
        return deco
    
    @timmer #test1=timmer(test1)
    def test1():
        time.sleep(3)
        print("in the test1")
    @timmer #=test2=timmer(test2)
    def test2():
        time.sleep(3)
        print("in the test2")
    test1()
    test2()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the test1
    in the func run  is 3.0001721382141113
    in the test2
    in the func run  is 3.00017094612121
    
    
    
    
    自己编写的完整的装饰器
    
    
    # -*- coding:UTF-8 -*-
    import time
    def timmer(func):
        def deco():
            func()
            print("welcome to beijing")
        return deco
    
    @timmer #test1=timmer(test1)
    def test1():
        time.sleep(3)
        print("in the test1")
    @timmer #=test2=timmer(test2)
    def test2():
        time.sleep(3)
        print("in the test2")
    test1()
    test2()
    
    
    ssh://root@192.168.0.75:22/usr/bin/python -u /app/py_code/test3.py
    in the test1
    welcome to beijing
    in the test2
    welcome to beijing
    
    
    
    
    传参数
    
    
    import time
    def timmer(func):
        def deco(name):
            start_time=time.time()
            func(name)
            stop_time=time.time()
            print("in the func run  is %s" % (stop_time-start_time))
        return deco
    
    #@timmer #=test1=timmer(test1)
    def test1():
        time.sleep(3)
        #print("in the test1")
    @timmer #=test2=timmer(test2)
    def test2(name):
        time.sleep(3)
        print("in the test2",name)
    test1()
    test2("bob")
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the test2 bob
    in the func run  is 3.000170946121216
    
    
    
    
    import time
    def timmer(func):
        def deco(arg1,arg2):
            start_time=time.time()
            func(arg1,arg2)
            stop_time=time.time()
            print("in the func run  is %s" % (stop_time-start_time))
        return deco
    
    #@timmer #=test1=timmer(test1)
    def test1():
        time.sleep(3)
        #print("in the test1")
    @timmer #=test2=timmer(test2)
    def test2(name,age):
        time.sleep(3)
        print("in the test2",name,age)
    test1()
    test2("bob",25)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the test2 bob 25
    in the func run  is 3.000170946121216
    
    
    
    通用型传递参数的装饰器
    
    import time
    def timmer(func):
        def deco(*args,**kwargs):
            start_time=time.time()
            func(*args,**kwargs)
            stop_time=time.time()
            print("in the func run  is %s" % (stop_time-start_time))
        return deco
    
    #@timmer #=test1=timmer(test1)
    def test1():
        time.sleep(3)
        #print("in the test1")
    @timmer #=test2=timmer(test2)
    def test2(name,age,high):
        time.sleep(3)
        print("in the test2",name,age,high)
    test1()
    test2("bob",25,170)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    in the test2 bob 25 170
    in the func run  is 3.0001721382141113
    
    
    
    
    
    
    https://www.cnblogs.com/cicaday/p/python-decorator.html
    
    
    基于类实现的装饰器:
    
    装饰器要求接受一个callable对象,并返回一个callable对象(不太严谨,详见后文)。那么用类来实现也是也可以的。我们可以让类的构造函数__init__()接受一个函数,然后重载__call__()并返回一个函数,也可以达到装饰器函数的效果。
    
    
    class logging(object):
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print ("[DEBUG]: enter function {func}()".format(
                func=self.func.__name__))
            return self.func(*args, **kwargs)
    @logging
    def say(something):
        print ("say {}!".format(something))
    say('hello')
    
    
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi3.py
    [DEBUG]: enter function say()
    say hello!
    
    
    
    自己改编的基于类实现的装饰器
    
    # -*- coding:UTF-8 -*-
    class logging(object):
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print ("[DEBUG]: enter function")
            return self.func(*args, **kwargs)
    @logging
    def say(something):
        print ("say",something)
    say('hello')
    
    
    ssh://root@192.168.0.75:22/usr/bin/python -u /app/py_code/test3.py
    [DEBUG]: enter function
    say hello
    
    
    
    
    
    
    带参数的类装饰器
    如果需要通过类形式实现带参数的装饰器,那么会比前面的例子稍微复杂一点。那么在构造函数里接受的就不是一个函数,而是传入的参数。通过类把这些参数保存起来。然后在重载__call__方法是就需要接受一个函数并返回一个函数。
    
    
    class logging(object):
        def __init__(self, level='INFO'):
            self.level = level
            
        def __call__(self, func): # 接受函数
            def wrapper(*args, **kwargs):
                print "[{level}]: enter function {func}()".format(
                    level=self.level,
                    func=func.__name__)
                func(*args, **kwargs)
            return wrapper  #返回函数
    
    @logging(level='INFO')
    def say(something):
        print "say {}!".format(something)
    
    
    
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi3.py
    [INFO]: enter function say()
    say hello!
    
    
    
    带参数的类装饰器--自己改编的
    
    # -*- coding:UTF-8 -*-
    class logging(object):
        def __init__(self, level='INFO'):
            self.level = level
    
        def __call__(self, func): # 接受函数
            def wrapper(*args, **kwargs):
                print ("[{level}]: enter function")
                func(*args, **kwargs)
            return wrapper  #返回函数
    
    @logging(level='INFO')
    def say(something):
        print ("say",something)
    say('hello')
    
    
    
    
    
    
    
    
    Python3学习(24)--内置装饰器
    
    
    
    python中@property装饰器的用法
    
    
    https://blog.csdn.net/wzqnls/article/details/53587049
    
    
    
    不使用@property实现类
    
    class Boy(object):
        def __init__(self, name):
            self.name = name
    
        def get_name(self):
            return self.name
    
        def set_name(self, new_name):
            self.name = new_name
    
        def del_name(self):
            del self.name
    boy = Boy('Tom')
    print(boy.get_name())
    
    
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi3.py
    Tom
    Alice
    
    
    
    
    
    使用@property实现上述类
    
    
    
    
    
    class Boy(object):
            def __init__(self, name):
                self._name = name
    
            @property
            def name(self):
                return self._name
    
            # 下面这个装饰器是由上面的@property衍生出来的装饰器
            @name.setter
            def name(self,new_name):
                self._name = new_name
    
            @name.deleter
            def name(self):
    
                del self._name
    boy = Boy('Tom')
    boy.name = 'white dog'
    print(boy.name)
    del boy.name
    
    
    
    
    实例二:
    
    
    
    
    
    class Animal(object):
        def __init__(self, name, age):
            self._name = name
            self._age = age
            self._color = 'Black'
    
        @property
        def name(self):
            return self._name
    
        @name.setter
        def name(self, value):
            self._name = value
    
        @property
        def age(self):
            return self._age
    
        @age.setter
        def age(self, value):
            if value > 0 and value < 100:
                self._age = value
            else:
                self._age = 0
                # print 'invalid age value.'
    
        @property
        def color(self):
            return self._color
    
        @color.setter
        def color(self, style):
            self._color = style
    
    
    a = Animal('black dog', 3)
    a.name = 'white dog'
    a.age = 300
    print ('Name:', a.name)
    print ('Age:', a.age)
    
    
    
    
    
    18、迭代器与生成器
    
    
    
    生成器:
    
    只记录当前的位置,不能向前 也不能后退
    只有一个a.__next__
    
    
    下面就是生成器; 打印的时候才有数据  不打印 没有数据
    >>> a=(i*2 for i in range(10))
    >>> a
    <generator object <genexpr> at 0x01FA3800>
    
    
    
    
    斐波拉契数列
    
    除第一个和第二个之外 所有的数都是由前两个数相加之和。
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            print(b)
            a,b,=b,a+b
            n=n+1
        return 'done'
    fib(10)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    
    Process finished with exit code 0
    
    
    
    解释;
    
    >>> a,b=1,2
    >>> a
    1
    >>> b
    2
    >>> t=(b,a+b)
    >>> t
    (2, 3)
    
    
    
    生成器:
    
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return 'done'
    print(fib(100))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    <generator object fib at 0x0178E4B8>
    
    
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return 'done'
    f=(fib(10))
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    1
    2
    
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return 'done'
    f=(fib(10))
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    1
    2
    3
    
    
    这样可以不等把10个都打印完    就可以打印其他东西
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return 'done'
    f=(fib(10))
    print(f.__next__())
    print("----------------------")
    print(f.__next__())
    print("+++++++++++++++++++++++")
    print(f.__next__())
    print(f.__next__())
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    ----------------------
    1
    +++++++++++++++++++++++
    2
    3
    
    
    相当于算法
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return 'done'
    f=(fib(10))
    print(f.__next__())
    print("----------------------")
    print(f.__next__())
    print("+++++++++++++++++++++++")
    print(f.__next__())
    print(f.__next__())
    print("-----------------for i in =-------------")
    for i in f:
        print(i)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    ----------------------
    1
    +++++++++++++++++++++++
    2
    3
    -----------------for i in =-------------
    5
    8
    13
    21
    34
    55
    
    
    
    
    
    
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return 'done'
    f=(fib(10))
    print(f.__next__())
    print("----------------------")
    print(f.__next__())
    print("+++++++++++++++++++++++")
    print(f.__next__())
    print(f.__next__())
    print("-----------------for i in =-------------")
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    print(f.__next__())
    
    
    
    
    打印超过10个报错:异常处理
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    1
    ----------------------
    1
    +++++++++++++++++++++++
    2
    3
    -----------------for i in =-------------
    5
    8
    13
    21
    34
    55
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py", line 22, in <module>
        print(f.__next__())
    StopIteration: done
    
    Process finished with exit code 1
    
    
    
    
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return "done"
    f=fib(10)
    
    
    while True:
        try:
            x = next(f)
            print('f', x)
        except StopIteration as e:
            print("generator return value",e.value)
            break
    
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    f 1
    f 1
    f 2
    f 3
    f 5
    f 8
    f 13
    f 21
    f 34
    f 55
    generator return value done
    
    
    
    
    
    import time
    def consumer(name):
        print("%s 准备吃饭"%name)
        while True:
            chifan=yield
    
            print("饭%s好了,被%s吃了"% (chifan,name))
    c=consumer("xiao ming")
    c.__next__()
    b="西红柿鸡蛋盖饭"
    c.send(b)
    c.__next__()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    xiao ming 准备吃饭
    饭西红柿鸡蛋盖饭好了,被xiao ming吃了
    饭None好了,被xiao ming吃了
    
    
    
    
    携程
    
    单线程并行效果 :多个任务进程同时运行  --异步IO的雏形
    
    
    import time
    def consumer(name):
        print("%s 准备吃饭"%name)
        while True:
            chifan=yield
    
            print("饭%s好了,被%s吃了"% (chifan,name))
    def producer(name):
        a1=consumer('C')
        a2=consumer('D')
        a1.__next__()
        a2.__next__()
        print("厨师开始做饭")
        for i in range(10):
            time.sleep(1)
            print("做好了两份饭")
            a1.send(i)
            a2.send(i)
    producer("bob")
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    C 准备吃饭
    D 准备吃饭
    厨师开始做饭
    做好了两份饭
    饭0好了,被C吃了
    饭0好了,被D吃了
    做好了两份饭
    饭1好了,被C吃了
    饭1好了,被D吃了
    做好了两份饭
    饭2好了,被C吃了
    饭2好了,被D吃了
    做好了两份饭
    饭3好了,被C吃了
    饭3好了,被D吃了
    做好了两份饭
    饭4好了,被C吃了
    饭4好了,被D吃了
    做好了两份饭
    饭5好了,被C吃了
    饭5好了,被D吃了
    做好了两份饭
    饭6好了,被C吃了
    饭6好了,被D吃了
    做好了两份饭
    饭7好了,被C吃了
    饭7好了,被D吃了
    做好了两份饭
    饭8好了,被C吃了
    饭8好了,被D吃了
    做好了两份饭
    饭9好了,被C吃了
    饭9好了,被D吃了
    
    Process finished with exit code 0
    
    
    
    
    迭代器
    
    
    
    迭代对象(Iterabale):可迭代对象:可循环的对象,包括:list dict tuple set(集合) str generator
    迭代器(Iterator):可以被next()函数调用 并不断返回下个值的对象成为迭代器
    
    
    
    迭代器和迭代对象的区别 
    
    迭代器是表示数据流,迭代器的计算的惰性的,只有在需要返回下一个值的时候才计算,而列表是提前计算好的,可以表示一个无限大的数据流,列表是有开始和结束值,是有限的 
    
    
    
    19 内置方法
    
    
    all()
    
    print(all([0,1,-1]))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    False
    
    
    
    print(any([0,1,-1]))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    True
    
    
    
    bin()  :把数字转换成二进制
    
    
    >>> bin(55)
    '0b110111'
    
    
    
    exec()  把字符串转成能够调用的对象
    
    
    code="""
    def fib(max):
        n,a,b=0,0,1
        while n<max:
            yield b
            a,b,=b,a+b
            n=n+1
        return "done"
    f=fib(10)
    
    
    while True:
        try:
            x = next(f)
            print('f', x)
        except StopIteration as e:
            print("generator return value",e.value)
            break
    
    
    """
    exec(code)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    f 1
    f 1
    f 2
    f 3
    f 5
    f 8
    f 13
    f 21
    f 34
    f 55
    generator return value done
    
    Process finished with exit code 0
    
    
    
    dir()
    
    >>> a=[]
    >>> dir(a)
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
    
    
    
    
    匿名函数:只能简单运算
    
    
    calc=lambda n:print(n)
    calc(5)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    5
    
    
    
    filter()
    
    
    t=filter(lambda n:n>5,range(10))
    for i in t:
        print(i)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    6
    7
    8
    9
    
    
    
    map()
    
    t=map(lambda n:n*n,range(10))
    for i in t:
        print(i)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    
    
    reduce()
    
    
    import functools
    t=functools.reduce(lambda x,y:x+y,range(10))
    
    print(t)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    45
    
    
    
    frozenset   不可变列表
    
    a=frozenset([900])
    
    
    
    
    globals()  :打印全局变量
    print(globals())
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'__spec__': None, '__doc__': None, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01714710>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py', '__cached__': None, '__package__': None}
    
    
    
    
    hash() :一种算法,它有很多算法
    
    思想:假如有5000个数字,要从里面取出特定的数字,如果要一个个的循环找  非常慢,如果用hash隔半去找  非常的快,
    
    
    
    >>> hash(1)
    1
    >>> hash(555)
    555
    >>> hash(rtyyuyu)
    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        hash(rtyyuyu)
    NameError: name 'rtyyuyu' is not defined
    >>> hash(坎坎坷坷)
    Traceback (most recent call last):
      File "<pyshell#3>", line 1, in <module>
        hash(坎坎坷坷)
    NameError: name '坎坎坷坷' is not defined
    >>> hash('ffkfkkgf')
    -2073949958
    
    
    
    
    hex():10进制转换成16进制
    
    
    
    >>> hex(260)
    '0x104'
    >>> hex(320)
    '0x140'
    >>> hex(480)
    '0x1e0'
    >>> hex(1600)
    '0x640'
    >>> hex(3600)
    '0xe10'
    
    
    sorted()
    
    
    a={1:9,2:8,3:7,4:6}
    print(sorted(a))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    [1, 2, 3, 4]
    
    
    a={1:9,2:8,3:7,4:6}
    print(sorted(a.items()))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    [(1, 9), (2, 8), (3, 7), (4, 6)]
    
    
    a={1:9,2:8,3:7,4:6}
    print(sorted(a.items(),key=lambda x:x[1]))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    [(4, 6), (3, 7), (2, 8), (1, 9)]
    
    
    
    zip()  拉链 
    合成一快
    
    
    a=[1,2,3,4]
    b=['a','b','c','d']
    for i in zip(a,b):
        print(i)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    (1, 'a')
    (2, 'b')
    (3, 'c')
    (4, 'd')
    
    
    
    20 Json与Picle 的数据序列化
    
    
    
    Json的数据序列化   :游戏挂起
    
    import json
    
    info={
        "name":"bob",
        "age":"18"
    
    }
    f=open("file.txt2","w")
    f.write(json.dumps(info))
    f.close()
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    
    Process finished with exit code 0
    
    
    Json的数据反序列化   游戏重新加载
    
    import json
    
    f=open("file.txt2",'r')
    data=json.loads(f.read())
    print(data["age"])
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    18
    
    Process finished with exit code 0
    
    
    pickle
    
    
    import pickle
    
    def neicun(name):
        print("hello",name)
    
    info={
        "name":"bob",
        "age":"18",
        "func":neicun
    }
    f=open("file.txt2","wb")
    f.write(pickle.dumps(info))
    f.close()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    
    Process finished with exit code 0
    
    
    import pickle
    
    def neicun(name):
        print("hello",name)
    
    info={
        "name":"bob",
        "age":"18",
        "func":neicun
    }
    f=open("file.txt2","wb")
    pickle.dump(info,f)
    f.close()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    
    Process finished with exit code 0
    
    
    
    pickle 反序列化
    
    
    import pickle
    
    def neicun(name):
        print("hello",name)
    
    info={
        "name":"bob",
        "age":"18",
        "func":neicun
    }
    def neicun(name):
        print("hello",name)
    
    
    f=open("file.txt2","rb")
    data=pickle.loads(f.read())
    print(data)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    {'name': 'bob', 'age': '18', 'func': <function neicun at 0x00771C00>}
    
    
    
    import pickle
    
    def neicun(name):
        print("hello",name)
    
    info={
        "name":"bob",
        "age":"18",
        "func":neicun
    }
    def neicun(name):
        print("hello",name)
    
    f=open("file.txt2","rb")
    data=pickle.loads(f.read())
    print(data["func"]("name"))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    hello name
    None
    
    
    
    
    import pickle
    
    def neicun(name):
        #print("hello",name)
        print("hello2",name)
    info={
        "name":"bob",
        "age":"18",
        "func":neicun
    }
    
    f=open("file.txt2","rb")
    data=pickle.loads(f.read())
    print(data["func"]("neicun"))
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    hello2 neicun
    None
    
    
    
    import pickle
    
    def neicun(name):
        #print("hello",name)
        print("hello2",name)
    info={
        "name":"bob",
        "age":"18",
        "func":neicun
    }
    
    f=open("file.txt2","rb")
    data=pickle.load(f)
    print(data["func"]("neicun"))
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/lianxi.py
    hello2 neicun
    None
    
    
    
    21 软件目录结构规范 :就是调用
    
    
    
    import os
    import sys
    dir_namae=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(dir_namae)
    from file3 import file3
    file3
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/file2.py
    hello
    
    
    
    
    
    第五章 第九节   
    
    
    shelve 模块:全部依次到处   再全部依次导入
    
    
    xml模块
    
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor name="Malaysia" direction="N"/>
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor name="Costa Rica" direction="W"/>
            <sex/>
                <mail>mail</mail>
    
    
    
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>
    
    
    
    import xml
    import xml.etree.ElementTree as ET
    tree=ET.parse("xml.test.xml")
    root=tree.getroot()
    
    for child in root:
        print(child.tag, child.attrib)
        for i in child:
            print(i.tag,i.text,i.attrib)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    country {'name': 'Liechtenstein'}
    rank 2 {'updated': 'yes'}
    year 2008 {}
    gdppc 141100 {}
    neighbor None {'name': 'Austria', 'direction': 'E'}
    neighbor None {'name': 'Switzerland', 'direction': 'W'}
    country {'name': 'Singapore'}
    rank 5 {'updated': 'yes'}
    year 2011 {}
    gdppc 59900 {}
    neighbor None {'name': 'Malaysia', 'direction': 'N'}
    country {'name': 'Panama'}
    rank 69 {'updated': 'yes'}
    year 2011 {}
    gdppc 13600 {}
    neighbor None {'name': 'Costa Rica', 'direction': 'W'}
    sex None {}
    mail mail {}
    neighbor None {'name': 'Colombia', 'direction': 'E'}
    
    Process finished with exit code 0
    
    
    
    
    import xml
    import xml.etree.ElementTree as ET
    tree=ET.parse("xml.test.xml")
    root=tree.getroot()
    
    for node in root.iter('year'):
        print(node.tag,node.text)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    year 2008
    year 2011
    year 2011
    
    
    
    
    
    第五周第十三章
    
    sha、md5 两种加密  sha更安全
    
    
    import hashlib
    m=hashlib.md5()
    m.update(b"bob")
    print(m.hexdigest())
    m.update(b"jon")
    print(m.hexdigest())
    
    m2=hashlib.md5()
    m2.update(b"bobjon")
    print(m.hexdigest())
    
    
    s2=hashlib.sha1()
    s2.update(b"bobjon")
    print(s2.hexdigest())
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    9f9d51bc70ef21ca5c14f307980a29d8
    2a017499db12fd36c76b797a8410f0f4
    2a017499db12fd36c76b797a8410f0f4
    ff9ab5becac0a97f1c395a692057669219bfe44c
    
    
    
    
    
    
    消息加密 加密更长 更安全
    
    
    import hmac
    h=hmac.new(b"bob55","Im here".encode(encoding="utf-8"))
    print(h.digest())
    print(h.hexdigest())
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    b'xedxc2x0fx13x00x98xc2lxf4xcdox0cxf12cxfe'
    edc20f130098c26cf4cd6f0cf13263fe
    
    Process finished with exit code 0
    
    
    
    
    第六周 第四章  类-opp编程
    
    
    
    class Role(object):
        n=123
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r2 = Role('Jack','terrorist','B22')  #生成一个角色
    r1.buy_gun("ak47")
    r2.got_shot()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    Alex just bought ak47
    ah...,I got shot...
    
    
    
    
    class Role(object):
        n=123  #类变量
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    print(Role.n)
    r1 = Role('Alex','police',"AK47") #生成一个角色
    print(r1.n,r1.name)
    r2 = Role('Jack','terrorist','B22')  #生成一个角色
    print(r2.n,r2.name)
    #r1.buy_gun("ak47")
    #r2.got_shot()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    123
    123 Alex
    123 Jack
    
    
    
    
    增加属性
    
    
    class Role(object):
        n=123  #类变量
        name="我是类name"
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    print(Role.n)
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.name="bob"
    r1.bullet_prove="true"
    print(r1.n,r1.name,r1.bullet_prove)
    r2 = Role('jack','terrorist','B22')  #生成一个角色
    r2.name="cat"
    print(r2.n,r2.name)
    #r1.buy_gun("ak47")
    #r2.got_shot()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    123
    123 bob true
    123 cat
    
    
    
    删除属性
    
    
    class Role(object):
        n=123  #类变量
        name="我是类name"
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    print(Role.n)
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.name="bob"
    r1.bullet_prove="true"
    print (r1.weapon)
    del r1.weapon
    
    
    
    print(r1.n,r1.name,r1.bullet_prove,r1.weapon)
    r2 = Role('jack','terrorist','B22')  #生成一个角色
    r2.name="cat"
    print(r2.n,r2.name)
    #r1.buy_gun("ak47")
    #r2.got_shot()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    123
    AK47
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py", line 28, in <module>
        print(r1.n,r1.name,r1.bullet_prove,r1.weapon)
    AttributeError: 'Role' object has no attribute 'weapon
    
    
    
    
    改类变量 :其实是在实例变量里面添加了一个实例变量 跟类变量没关系
    
    
    class Role(object):
        n="改类变量前"  #类变量
        name="我是类name"
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    print(Role.n)
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.name="bob"
    r1.bullet_prove="true"
    r1.n="改类变量后"
    print (r1.n)
    
    print(r1.n,r1.name,r1.bullet_prove,r1.weapon)
    
    
    r2 = Role('jack','terrorist','B22')  #生成一个角色
    r2.name="cat"
    print(r2.n,r2.name)
    #r1.buy_gun("ak47")
    #r2.got_shot()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    改类变量前
    改类变量后
    改类变量后 bob true AK47
    改类变量前 cat
    
    Process finished with exit code 0
    
    
    
    
    class Role(object):
        n=123  #类变量
        name="dog"
    
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.name="bob"
    r1.bullet_prove="true"
    r1.n="beet"
    
    print(Role.n)
    
    
    r2 = Role('jack','terrorist','B22')  #生成一个角色
    r2.name="cat"
    Role.n="abc"
    print(Role.n)
    #r1.buy_gun("ak47")
    #r2.got_shot()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    123
    abc
    
    
    
    
    
    
    
    
    class Role(object):
        n=123  #类变量
        name="我是类name"
        list=[]
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    print(Role.n)
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.name="bob"
    r1.bullet_prove="true"
    r1.n="beet"
    r1.list.append("china")
    print (r1.n)
    
    print(r1.n,r1.name,r1.bullet_prove,r1.weapon,r1.list)
    
    
    r2 = Role('jack','terrorist','B22')  #生成一个角色
    r2.name="cat"
    Role.n="abc"
    print(r1.n,r2.n,r1.list)
    #r1.buy_gun("ak47")
    #r2.got_shot()
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/dir/file2/333.py
    123
    beet
    beet bob true AK47 ['china']
    beet abc ['china']
    
    
    
    
    
    
    第六周  第六章
    
    
    
    1、构造函数:
    
    
    def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
    
    
    
    
    
    
    
    类变量的作用 ----节省内存,如果放在实例变量里面   每次实例化的时候都会增加一个内存。
    
    
    2、析构函数:在实例释放、销毁的时候执行的,通常用于做一些收尾工作,比如关闭一些数据库连接、打开的临时文件。
    
    
    
    class Role(object):
        n=123  #类变量
        name="dog"
    
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
        def __del__(self):
            print("%s is dead " % self.name)
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Alex is dead 
    
    
    
    
    
    class Role(object):
        n=123  #类变量
        name="dog"
    
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.life_value = life_value
            self.money = money
        def __del__(self):
            print("%s is dead " % self.name)
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.buy_gun("AK47")
    r1.got_shot()
    
    r2 = Role('jack','terrorist','B22')
    r2.got_shot()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Alex just bought AK47
    ah...,I got shot...
    ah...,I got shot...
    jack is dead 
    Alex is dead 
    
    
    
    
    
    3、私有方法、私有属性
    
    
    属性:静态属性、动态属性         
    
    静态属性:就是变量
    
    动态属性:就是方法
    
    
    一般属性就是变量   方法就是方法
    
    
    
    私有:别人访问不了, 如果别人能访问  就可以改动 ,所以规定只能在中枪后减小血量,别人能看到还剩多少血量, 例如:  r1.life_value="0"
    
    
    
    
    
    私有属性:
    
    
    class Role(object):
        n=123  #类变量
        name="dog"
    
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.__life_value = life_value
            self.money = money
    
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.buy_gun("AK47")
    r1.got_shot()
    
    print(r1.__life_value)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 25, in <module>
        print(r1.life_value)
    AttributeError: 'Role' object has no attribute 'life_value'
    Alex just bought AK47
    ah...,I got shot...
    
    
    
    
    别人怎么看还剩多少血量
    
    
    
    class Role(object):
        n=123  #类变量
        name="dog"
    
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.__life_value = life_value
            self.money = money
        def show_data(self):
            print("name:%s weapon:%s life_value:%s" % (self.name,self.weapon,self.__life_value))
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.buy_gun("AK47")
    r1.show_data()
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Alex just bought AK47
    name:Alex weapon:AK47 life_value:100
    
    
    
    
    
    
    在内部也可以访问:
    
    
    
    class Role(object):
        n=123  #类变量
        name="dog"
    
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.__life_value = life_value
            self.money = money
        def show_data(self):
            print("name:%s weapon:%s life_value:%s" % (self.name,self.weapon,self.__life_value))
        def shot(self):
            print("shooting...")
    
        def got_shot(self):
            self.__life_value -= 50
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.buy_gun("AK47")
    r1.got_shot()
    r1.show_data()
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Alex just bought AK47
    ah...,I got shot...
    name:Alex weapon:AK47 life_value:50
    
    
    
    
    私有方法: def got_shot(self):   外部无法访问
    
    
    
    class Role(object):
        n=123  #类变量
        name="dog"
    
        def __init__(self,name,role,weapon,life_value=100,money=15000):
            self.name = name
            self.role = role
            self.weapon = weapon
            self.__life_value = life_value
            self.money = money
        def show_data(self):
            print("name:%s weapon:%s life_value:%s" % (self.name,self.weapon,self.__life_value))
        def __shot(self):
            print("shooting...")
    
        def got_shot(self):
            self.__life_value -= 50
            print("ah...,I got shot...")
    
        def buy_gun(self,gun_name):
            print("%s just bought %s" % (self.name,gun_name) )
    
    r1 = Role('Alex','police',"AK47") #生成一个角色
    r1.buy_gun("AK47")
    r1.__got_shot()
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 25, in <module>
        r1.__got_shot()
    AttributeError: 'Role' object has no attribute '__got_shot'
    Alex just bought AK47
    
    
    
    
    
    
    
    第六周 第七章  类的继承
    
    
    
    面向对象的特性 :封装  继承 多态
    
    
    
    
    类的继承:
    
    
    class People:
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Man(People):
        pass
    m1=Man("bob",25)
    m1.eat()
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is eating..
    
    
    
    
    
    子类定义方法:
    
    
    
    class People:
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Man(People):
        def write(self):
            print("%s is writting" % self.name)
    m1=Man("bob",25)
    m1.write()
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is writting
    
    
    
    
    
    重构父类方法:
    
    
    
    class People:
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Man(People):
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    
    
    m1=Man("bob",25)
    m1.write()
    m1.sleep()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is writting
    bob is sleeping
    man is sleeping
    
    
    
    
    class People:
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Man(People):
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25)
    m1.write()
    
    w1=Woman("Jon",35)
    w1.get_birth()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is writting
    Jon is get_birth
    
    
    
    第六周  第八章:
    
    
    
    对构造函数进行重构:
    
    
    
    
    class People:
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Man(People):
        def __init__(self,name,age,money):
            People.__init__(self,name,age)
            self.money=money
            print("%s birth is have %s dollor" % (self.name,self.money))
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25,10)
    m1.write()
    
    w1=Woman("Jon",35)
    w1.get_birth()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob birth is have 10 dollor
    bob is writting
    Jon is get_birth
    
    
    
    多个子类重构用下面这个:
    
    
    
    class People:
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Man(People):
        def __init__(self,name,age,money):
            #People.__init__(self,name,age)
            super(Man,self).__init__(name,age)
            self.money=money
            print("%s birth is have %s dollor" % (self.name,self.money))
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25,10)
    m1.write()
    
    w1=Woman("Jon",35)
    w1.get_birth()
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob birth is have 10 dollor
    bob is writting
    Jon is get_birth
    
    
    
    
    
    经典类和新式类的区别主要体现在类的继承上
    
    
    
    新式类:class People(object):
    
    
    
    多继承
    
    
    
    class People(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Relation(object):
        def make_friends(self,obj):
            print("%s is make friends with %s" % (self.name,obj.name))
    class Man(People,Relation):
        def __init__(self,name,age,money):
            #People.__init__(self,name,age)
            super(Man,self).__init__(name,age)  #新式类写法
            self.money=money
            print("%s birth is have %s dollor" % (self.name,self.money))
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25,10)
    w1=Woman("Jon",35)
    m1.make_friends(w1)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob birth is have 10 dollor
    bob is make friends with Jon
    
    
    
    
    第八章  类的继承2
    
    
    多继承
    
    
    class People(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Relation(object):
        def make_friends(self,obj):
            print("%s is make friends with %s" % (self.name,obj.name))
    class Man(People,Relation):
        def __init__(self,name,age,money):
            super(Man,self).__init__(name,age)
            self.money=money
            print("%s birth is have %s dollor" % (self.name,self.money))
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People,Relation):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25,10)
    w1=Woman("Jon",35)
    m1.make_friends(w1)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob birth is have 10 dollor
    bob is make friends with Jon
    
    
    
    下面第一种方式正确,第二种方式错误   必须是  self.friends.append(obj)
    
    下面第一种方式解释:
    类People定义构造函数, 类Relation故意不定义构造函数,注意Relation里面可以使用People的self.friends=[] 如果不写,后面报错, Man继承People 、Relation。Woman继承People 、Relation

     1、第一种

    1.1 正确

    class People(object):

        def __init__(self,name,age):
            self.name=name
            self.age=age
            self.friends=[]            # 这句话表明把self.name=name 里面的name写到列表里面
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Relation(object):
        def make_friends(self,obj):
            print("%s is make friends with %s" % (self.name,obj.name))    #显示灰色正常
            self.friends.append(obj)    # 这一步对应 m1.make_friends(w1),obj是一个实例等价于Woman("Jon",35)这个整体类,可以使用obj.name=Woman.name,就相当于调用类People里面的self.name即People.name,这就是类的继承
    class Man(People,Relation):
        def __init__(self,name,age,money):
            super(Man,self).__init__(name,age)
            self.money=money
            print("%s birth is have %s dollor" % (self.name,self.money))
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People,Relation):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25,10)
    w1=Woman("Jon",35)        # 这一步把这两个参数传递给下一步 m1.make_freiends(w1)里面
    m1.make_friends(w1)    # 这一步会把w1里面的 Jon,35这两个参数通过make_friends函数写到self.friends[]列表里面
    w1.name="klog"       # 这一步是把w1=Woman("Jon,35")里面的Jon重新赋值成klog,然后重新执行m1.make_friends(w1)而不是清空列表,所以下一步打印出来的结果示klog,如果注释掉这句话,就会打印出来上一步列表里面的Jon
    print(m1.friends[0].name) # 
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob birth is have 10 dollor
    bob is make friends with Jon
    klog
    
    
    1.2  自己改动的
    class People(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
            self.friends=[]
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Relation(object):
        def make_friends(self,obj):
            print("%s is make friends with %s" % (self.name,obj.name))
            self.friends.append(obj)
    class Man(People,Relation):
        def __init__(self,name,age,money):
            super(Man,self).__init__(name,age)
            self.money=money
            print("%s birth is have %s dollor" % (self.name,self.money))
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People,Relation):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25,10)
    w1=Woman("Jon",35)
    m1.make_friends(w1)
    w1.name="klog"
    print(m1.friends[0].name)
    m1.make_friends(w1)
    print(m1.friends[1].name)
    
    
    
    bob birth is have 10 dollor
    bob is make friends with Jon
    klog
    bob is make friends with klog
    klog
    
    
    2、第二种  错误的方式

    class People(object): def __init__(self,name,age): self.name=name self.age=age self.friends=[] def eat(self): print("%s is eating.." % self.name) def talk(self): print("%s is sleeping" % self.name) def sleep(self): print("%s is sleeping" % self.name) class Relation(object): def make_friends(self,obj): print("%s is make friends with %s" % (self.name,obj.name)) self.friends.append(obj.name)          # 这句话表明添加完对象后就写进了People类里面的self.friends列表里面,只添加 name class Man(People,Relation):                # Man类继承了People类和Relation类 def __init__(self,name,age,money): super(Man,self).__init__(name,age)       # 这句话把People类里面的 name、age参数 重写了一遍 self.money=money print("%s birth is have %s dollor" % (self.name,self.money)) def write(self): print("%s is writting" % self.name) def sleep(self): People.sleep(self) print("man is sleeping") class Woman(People,Relation):              # 这个Woman类继承了 People类和Relation类 def get_birth(self): print("%s is get_birth" % self.name) m1=Man("bob",25,10) w1=Woman("Jon",35) m1.make_friends(w1)            # 这句话表明把w1里面的两个参数看成一个整体obj对象传给了make_friends函数 w1.name="klog"                       # 这句话把Jon替换成了klog又重新执行了一遍make_friends,看下面2.2 打印的结果 print(m1.friends[0])                    # 这句话表明只打印w1元组里面的第一个数值 'Jon' C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py bob birth is have 10 dollor bob is make friends with Jon Jon
    
    
    
    
    第六章 经典类与新式类   先走Relation   
    
    
    
    super(Man,self).__init__(name,age)    按照继承顺序来继承
    
    
    
    
    继承的先后顺序  前提是man 里面没有构造函数的时候 先走Relation
    
    
    
    class People(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
            self.friends=[]
            print("get the people way")
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Relation(object):
        def __init__(self,n1,n2):
            print("get the Relation way")
        def make_friends(self,obj):
            print("%s is make friends with %s" % (self.name,obj.name))
            self.friends.append(obj.name)
    class Man(Relation,People):
    
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People,Relation):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    get the Relation way
    
    
    
    
    man里面有People构造函的时候,先走people   
    
    
    class People(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
            self.friends=[]
            print("get the people way")
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Relation(object):
        def __init__(self,n1,n2):
            print("get the Relation way")
        def make_friends(self,obj):
            print("%s is make friends with %s" % (self.name,obj.name))
            self.friends.append(obj.name)
    class Man(Relation,People):
        def __init__(self,name,age,money):
            People.__init__(self,name,age)
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People,Relation):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    
    m1=Man("bob",25,10)
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    get the people way
    
    
    
    
    
    man里面如果是 super构造函数的时候,自动按照优先顺序 先走Relation
    
    
    
    class People(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
            self.friends=[]
            print("get the people way")
        def eat(self):
            print("%s is eating.." % self.name)
        def talk(self):
            print("%s is sleeping" % self.name)
        def sleep(self):
            print("%s is sleeping" % self.name)
    class Relation(object):
        def __init__(self,n1,n2):
            print("get the Relation way")
        def make_friends(self,obj):
            print("%s is make friends with %s" % (self.name,obj.name))
            self.friends.append(obj.name)
    class Man(Relation,People):
        def __init__(self,name,age):
            super(Man,self).__init__(name,age)
        def write(self):
            print("%s is writting" % self.name)
        def sleep(self):
            People.sleep(self)
            print("man is sleeping")
    class Woman(People,Relation):
        def get_birth(self):
            print("%s is get_birth" % self.name)
    
    m1=Man("bob",25)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    get the Relation way
    
    
    
    
    
    
    
    
    类的继承先后顺序
    
    
    python2里面的经典类和新式类都是深度优先策略,python3里面的经典类和新式类都是广义优先。
    
    广义优先的查询路径:D-B-C-A 
    深度优先的查询路径:D-B-A
    
    
    
    class A:
        def __init__(self):
            print("A")
    class B(A):
        pass
    
    class C(A):
        pass
    class D(B,C):
        def __init__(self):
            print("D")
    D()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    D
    
    
    
    class A(object):
        def __init__(self):
            print("A")
    class B(A):
        pass
    
    class C(A):
        pass
    class D(B,C):
        def __init__(self):
            print("D")
    D()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    D
    
    
    
    
    
    
    
    
    
    class A:
        def __init__(self):
            print("A")
    class B(A):
        def __init__(self):
            print("B")
    class C(A):
        def __init__(self):
            print("C")
    class D(B,C):
        pass
    D()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    B
    
    
    
    
    
    
    
    class A:
        def __init__(self):
            print("A")
    class B(A):
        pass
    
    class C(A):
        def __init__(self):
            print("C")
    class D(B,C):
        pass
    D()
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    C
    
    
    
    
    
    class A:
        def __init__(self):
            print("A")
    class B(A):
        pass
    
    class C(A):
        pass
    class D(B,C):
        pass
    D()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    A
    
    
    
    
    
    
    
    第六周 第十章   继承类实例讲解
    class school(object):
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
            #self.students=[]
            #self.teacher=[]
    
        def enroll(self,stu_obj):
            print("为学员%s办理注册手续" % stu_obj.name)
            #self.students.append(stu_obj)
    class schoolnumber(object):
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def tell(self):
            pass
    class teacher(schoolnumber):
        def __init__(self,name,age,sex,salary,course):
            super(teacher,self).__init__(name,age,sex)
            self.salary=salary
            self.course=course
        def tell(self):
            print('''
    
           ---------info of teacher:%s----
            name:%s
            age:%s
            sex:%s
            salary:%s
            course:%s
            '''% (self.name,self.name,self.age,self.sex,self.salary,self.course))
        def teach(self):
            print("%s is teaching course %s" % (self.name,self.course))
    
    class students(schoolnumber):
        def __init__(self,name,age,sex,stu_id,grade):
            super(students,self).__init__(name,age,sex)
            self.stu_id=stu_id
            self.grade=grade
        def tell(self):
            print('''
    
           ---------info of teacher:%s----
            name:%s
            age:%s
            sex:%s
            stu_id:%s
            grade:%s
            '''% (self.name,self.name,self.age,self.sex,self.stu_id,self.grade))
        def pay_for(self,amount):
            print("%s is pay for %s dollars" % (self.name,amount))
    
    school=school("河北工大","天津")
    t1=teacher("bob",33,"man",5000,"math")
    students=students("jack",22,"man",101880,"linux")
    school.enroll(students)
    

     C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py

    为学员jack办理注册手续
    
    

    实例2:
    class school(object):
        def __init__(self,name,addr):
            self.name=name
            self.addr=addr
            self.students_number=[]
            self.staffs_number=[]
    
        def enroll(self,stu_obj):
            #self.students.append(stu_obj)
            print("为学员%s办理注册手续" % stu_obj.name)
            self.students_number.append(stu_obj)
        def hire(self,staff_obj):
            print("%s is hired" % staff_obj.name)
            self.staffs_number.append(staff_obj)
    class schoolnumber(object):
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def tell(self):
            pass
    class teacher(schoolnumber):
        def __init__(self,name,age,sex,salary,course):
            super(teacher,self).__init__(name,age,sex)
            self.salary=salary
            self.course=course
        def tell(self):
            print('''
    
           ---------info of teacher:%s----
            name:%s
            age:%s
            sex:%s
            salary:%s
            course:%s
            '''% (self.name,self.name,self.age,self.sex,self.salary,self.course))
        def teach(self):
            print("%s is teaching course %s" % (self.name,self.course))
    
    class students(schoolnumber):
        def __init__(self,name,age,sex,stu_id,grade):
            super(students,self).__init__(name,age,sex)
            self.stu_id=stu_id
            self.grade=grade
        def tell(self):
            print('''
    
           ---------info of teacher:%s----
            name:%s
            age:%s
            sex:%s
            stu_id:%s
            grade:%s
            '''% (self.name,self.name,self.age,self.sex,self.stu_id,self.grade))
        def pay_for(self,amount):
            print("%s is pay for %s dollars" % (self.name,amount))
    
    institution=school("河北工大","天津")
    s1=students("bob",33,"man",5000,"math")
    s2=students("cat",35,"man",6000,"scientist")
    t1=teacher("hing_teacher",33,"man",5000,"math")
    t2=teacher("jack_teacher",22,"man",101880,"linux")
    #t1.teach()
    institution.enroll(s1)
    institution.enroll(s2)
    institution.hire(t1)
    institution.hire(t2)
    print(institution.students_number)
    print(institution.staffs_number)
    
    #institution.staffs[0].teach()
    for str in institution.students_number:
        str.pay_for(5000)
    
    
    ssh://root@192.168.0.204:22/usr/bin/python -u /home/progect/app/py_code/test1.py
    为学员bob办理注册手续
    为学员cat办理注册手续
    hing_teacher is hired
    jack_teacher is hired
    [<__main__.students object at 0x7f8d30dc0e10>, <__main__.students object at 0x7f8d30dc0e48>]
    [<__main__.teacher object at 0x7f8d30dc0e80>, <__main__.teacher object at 0x7f8d30dc0eb8>]
    bob is pay for 5000 dollars
    cat is pay for 5000 dollars
    

      

    
    第六周 第十一章   多态实例讲解
    
    
    意思:同一种接口,多种实现。
    
    
    
    
    
    
    
    class Animal(object):
        def __init__(self,name):
            self.name=name
        def talk(self):
            pass
    
    class Dog(Animal):
        def talk(self):
            print("wang wangw wang")
    
    class Cat(Animal):
        def talk(self):
           print("miao miao miao")
    
    def animal_talk(obj):
        obj.talk()
    
    
    a=Dog("bob")
    b=Cat("jack")
    animal_talk(a)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    wang wangw wang
    
    
    
    
    
    class Animal(object):
        def __init__(self,name):
            self.name=name
        def talk(self):
            pass
        @classmethod
        def animal_talk(self,obj):
            obj.talk()
    class Dog(Animal):
        def talk(self):
            print("wang wangw wang")
    
    class Cat(Animal):
        def talk(self):
           print("miao miao miao")
    
    a=Dog("bob")
    b=Cat("jack")
    Animal.animal_talk(a)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    wang wangw wang
    
    
    
    
    
    第七周 第三章   静态方法  类方法 属性方法
    
    
    静态方法  只是名义上上归类管理,实例上在静态方法里访问不了类和实例中的任何属性
    
    类方法    没啥用,只能访问类变量,不能访问实例变量
    
    属性方法   有用,作用:把一个方法变成一个静态属性
    
    
    
    1、静态方法  :只是名义上上归类管理,实例上在静态方法里访问不了类和实例中的任何属性
    
    
    
    
    
    没啥用  类似于os.mkdir 等分离的工具包
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        @staticmethod  #这个的意思是底下的函数和类没什么关系
        def eat():
            print("%s is eating %s" % ("cat","馒头"))
    
    d=Dog("bob")
    d.eat()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    cat is eating 馒头
    
    
    
    
    
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        @staticmethod  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
    
    d=Dog("bob")  
    d.eat(d)  #传的是实例d
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is eating 馒头
    
    
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        @staticmethod  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat(d)  #传的是实例d
    d.talk()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is eating 馒头
    bob is talking
    
    
    
    
    
    
    
    2、类方法     没啥用
    
    
    
    只能访问类变量,不能访问实例变量
    
    
    
    
    class Dog(object):
        n=555
        def __init__(self,name):
            self.name=name
        @classmethod  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.n,"馒头"))
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat()
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    555 is eating 馒头
    
    
    
    
    
    
    class Dog(object):
        name="jack"
        def __init__(self,name):
            self.name=name
            
        @classmethod  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    jack is eating 馒头
    
    
    
    
    3、属性方法    :有用
    
    
    作用:把一个方法变成一个静态属性
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
    
        @property  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat()
    
    
    
    
     C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is eating 馒头
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 13, in <module>
        d.eat()
    TypeError: 'NoneType' object is not callable
    
    
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
    
        @property  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is eating 馒头
    
    
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
    
        @property  #这个的意思是底下的函数和类没什么关系
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat("bao zi")
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 13, in <module>
        d.eat("bao zi")
    TypeError: eat() missing 1 required positional argument: 'food'
    
    
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
    
        @property  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat="bao zi"
    
    
    
    
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 13, in <module>
        d.eat="bao zi"
    AttributeError: can't set attribute
    
    
    
    正确的写法:
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
    
        @property  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
        @eat.setter
        def eat(self,food):
            print("set to food:",food)
    
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat="bao zi"
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    set to food bao zi
    
    
    
    错误:
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
    
        @property  #这个的意思是底下的函数和类没什么关系
        def eat(self):
            print("%s is eating %s" % (self.name,"馒头"))
        @eat.setter
        def eat(self,food):
            print("set to food:",food)
    
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat
    d.eat="bao zi"
    d.eat
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is eating 馒头
    set to food: bao zi
    bob is eating 馒头
    
    
    
    
    正确:把一个方法变成一个属性;隐藏过程,给用户直接的结果
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
            self.food=None
        @property  
        def eat(self):
            print("%s is eating %s" % (self.name,self.food))
        @eat.setter
        def eat(self,food):
            self.food=food
            print("set to food:",food)
            #self.food=food
    
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat
    d.eat="bao zi"
    d.eat
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    bob is eating None
    set to food: bao zi
    bob is eating bao zi
    
    
    
    
    删除属性:
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
            self.food=None
        @property  
        def eat(self):
            print("%s is eating %s" % (self.name,self.food))
        @eat.setter
        def eat(self,food):
            self.food=food
            print("set to food:",food)
            #self.food=food
    
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    
    del d.name
    print(d.name)
    d.eat
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 21, in <module>
        print(d.name)
    AttributeError: 'Dog' object has no attribute 'name'
    
    
    
    
    
    删除属性方法:
    
    
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name=name
            self.food=None
        @property  
        def eat(self):
            print("%s is eating %s" % (self.name,self.food))
        @eat.setter
        def eat(self,food):
            self.food=food
            print("set to food:",food)
            #self.food=food
        @eat.deleter
        def eat(self):
            del self.food
            print("删除完毕")
    
        def talk(self):
            print("%s is talking" % self.name)
    
    d=Dog("bob")
    d.eat="bao zi"
    del d.eat
    d.eat
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 25, in <module>
        d.eat
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 8, in eat
        print("%s is eating %s" % (self.name,self.food))
    AttributeError: 'Dog' object has no attribute 'food'
    set to food: bao zi
    删除完毕
    
    
    
    
    
    
    属性方法的实用实例
    
    
    
    
    class Flight(object):
        def __init__(self,name):
            self.flight_name = name
    
    
        def checking_status(self):
            print("checking flight %s status " % self.flight_name)
            return  1
    
        @property
        def flight_status(self):
            status = self.checking_status()
            if status == 0 :
                print("flight got canceled...")
            elif status == 1 :
                print("flight is arrived...")
            elif status == 2:
                print("flight has departured already...")
            else:
                print("cannot confirm the flight status...,please check later")
    
    
    f = Flight("CA980")
    f.flight_status
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    checking flight CA980 status 
    flight is arrived...
    
    
    
    
    
    class Flight(object):
        def __init__(self,name):
            self.flight_name = name
    
    
        def checking_status(self):
            print("checking flight %s status " % self.flight_name)
            return  1
    
        @property
        def flight_status(self):
            status = self.checking_status()
            if status == 0 :
                print("flight got canceled...")
            elif status == 1 :
                print("flight is arrived...")
            elif status == 2:
                print("flight has departured already...")
            else:
                print("cannot confirm the flight status...,please check later")
    
        @flight_status.setter
        def flight_status(self,status):
            print("the %s status is %s" % (self.flight_name,status))
    
    
    
    f = Flight("CA980")
    f.flight_status=2
    f.flight_status
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    the CA980 status is 2
    checking flight CA980 status 
    flight is arrived...
    
    
    
    
    
    第七周  第五章  深入讲解类的特殊成员方法
    
    
    属于高级方法 不用也可以
    
    
    
    第七周 第七章   反射
    
    
    hasatrr(obj,name_str) : 判断一个对象里是否有对应的字符串的方法。
    
    gerattr(obj,name_str)   :根据字符串去获取obj对象里的方法的内存地址
    
    
    setattr(obj,'y',z),  设置属性
    
    delattr(obj,'y',z) 删除属性
    
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
    
    
    d=Dog("bob")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        func=getattr(d,choice)
        func("food")
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    >>:eat
    bob is eating food
    
    
    
    
    def bulk(self):
        print("%s is yelling" % self.name)
    
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
    
    
    d=Dog("bob")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        func=getattr(d,choice)
        func("food")
    else:
        setattr(d,choice,bulk)
        d.talk(d)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    >>:talk
    bob is yelling
    
    
    
    
    动态把字符串转换成属性
    
    
    
    def bulk(self):
        print("%s is yelling" % self.name)
    
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
    
    
    d=Dog("bob")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        func=getattr(d,choice)
        func("food")
    else:
        setattr(d,choice,22)
        print(getattr(d,choice))
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    >>:age
    22
    
    
    
    
    调已有的变量会报错
    
    
    def bulk(self):
        print("%s is yelling" % self.name)
    
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
    
    
    d=Dog("bob")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        func=getattr(d,choice)
        func("food")
    else:
        setattr(d,choice,22)
        print(getattr(d,choice))
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    >>:name
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 16, in <module>
        func("food")
    TypeError: 'str' object is not callable
    
    
    
    
    
    
    如果不存在,新建一个属性
    
    
    def bulk(self):
        print("%s is yelling" % self.name)
    
    
    class Dog(object):
        def __init__(self,name):
            self.name=name
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
    
    
    d=Dog("bob")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        attr=getattr(d,choice)
        print(attr)
    else:
        setattr(d,choice,22)
        print(getattr(d,choice))
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    >>:name
    bob
    
    
    
    
    
    如果存在属性,进行修改。
    
    
    
    def bulk(self):
        print("%s is yelling" % self.name)
    
    
    class Dog(object):
        def __init__(self,name,age):
            self.name=name
            #self.age=age
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
    
    
    d=Dog("bob",24)
    choice=input(">>:").strip()
    if hasattr(d,choice):
    
        setattr(d,choice,"jack")
        print(getattr(d,choice))
    else:
        setattr(d,choice,22)
        print(getattr(d,choice))
    
    #print(d.name)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    >>:name
    jack
    
    
    
    
    如果存在属性  进行删除
    
    
    
    def bulk(self):
        print("%s is yelling" % self.name)
    
    
    class Dog(object):
        def __init__(self,name,age):
            self.name=name
            #self.age=age
        def eat(self,food):
            print("%s is eating %s" % (self.name,food))
    
    
    d=Dog("bob",24)
    choice=input(">>:").strip()
    if hasattr(d,choice):
        delattr(d,choice)
    
    else:
        setattr(d,choice,22)
        print(getattr(d,choice))
    
    print(d.name)
    
    
    
    
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 22, in <module>
        print(d.name)
    AttributeError: 'Dog' object has no attribute 'name'
    
    
    
    
    
    
    第七周   第九章  异常处理
    
    
    
    
    data={}
    try:
        data["name"]
    except KeyError as e:
        print("没有这个key",e)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    没有这个key 'name'
    
    
    
    
    
    
    name=["bob","cat"]
    data={}
    #name[3]
    
    try:
        name[3]
        data["hot"]
    except KeyError as e:
        print("没有这个key",e)
    except IndexError as e:
        print("列表超出范围",e)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    列表超出范围 list index out of range
    
    
    
    
    
    
    抓所有    不要用
    
    name=["bob","cat"]
    data={}
    #name[3]
    
    try:
        name[3]
        data["hot"]
        name[778]
    except Exception as e:
        print("出错",e)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    出错 list index out of range
    
    
    
    
    
    
    name=["bob","cat"]
    data={}
    #name[3]
    
    try:
        #name[3]
        #data["hot"]
        open("texe")
    except IndexError as e:
        print("出错",e)
    except KeyError as e:
        print("列表超出范围",e)
    except Exception as e:
        print("未知出错",e)
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    未知出错 [Errno 2] No such file or directory: 'texe'
    
    
    
    
    
    name=["bob","cat"]
    data={}
    #name[3]
    
    try:
        #name[3]
        #data["hot"]
        #open("texe")
        a=3
        print(a)
    except IndexError as e:
        print("出错",e)
    except KeyError as e:
        print("列表超出范围",e)
    except Exception as e:
        print("未知出错",e)
    
    else:
        print("一切正常")
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    3
    一切正常
    
    
    
    
    
    
    name=["bob","cat"]
    data={}
    #name[3]
    
    try:
        #name[3]
        #data["hot"]
        #open("texe")
        a=3
        print(a)
    except IndexError as e:
        print("出错",e)
    except KeyError as e:
        print("列表超出范围",e)
    except Exception as e:
        print("未知出错",e)
    
    else:
        print("一切正常")
    
    finally:
        print("不管有错没错都执行")
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    3
    一切正常
    不管有错没错都执行
    
    
    
    
    
    name=["bob","cat"]
    data={}
    #name[3]
    
    try:
        #name[3]
        data["hot"]
        #open("texe")
        #a=3
        #print(a)
    except IndexError as e:
        print("出错",e)
    except KeyError as e:
        print("列表超出范围",e)
    except Exception as e:
        print("未知出错",e)
    
    else:
        print("一切正常")
    
    finally:
        print("不管有错没错都执行")
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    列表超出范围 'hot'
    不管有错没错都执行
    
    
    
    
    
    自定义异常处理:
    
    
    
    class AlexException(Exception):
        def __init__(self,msg):
            self.message=msg
        def __str__(self):
            return self.message
    try:
        raise AlexException("数据库连不上")
    except AlexException as e:
        print(e)
    
    
    
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    数据库连不上
    
    
    
    
    
    class AlexException(Exception):
        def __init__(self,msg):
            self.message=msg
        def __str__(self):
            return "lklj"
    try:
        raise AlexException("数据库连不上")
    except AlexException as e:
        print(e)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    lklj
    
    
    
    
    定义的IndexError 不能和自带的异常冲突,下面的定义错误
    
    
    
    class IndexError(Exception):
        def __init__(self,msg):
            self.message=msg
        def __str__(self):
            return "lklj"
    try:
        name=[]
        name[3]
        raise IndexError("数据库连不上")
    except IndexError as e:
        print(e)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    Traceback (most recent call last):
      File "C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py", line 8, in <module>
        name[3]
    IndexError: list index out of range
    
    
    
    
    
    
    
    try:
        name=[]
        name[3]
        #raise IndexError("数据库连不上")
    except IndexError as e:
        print(e)
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    list index out of range
    
    
    
    
    
    
    第七周 第10章  网络编程 socket
    
    
    
    意思:发数据 接受数据
    
    
    
    
    
    第七周  第11章   网络编程 socket
    
    
    
    第七周  第12章   网络编程 socket案例 消息发送与接受
    
    
    
    server 端
    
    
    
    import socket
    server =socket.socket()
    server.bind(("localhost",6800))
    server.listen(600)
    
    print("我要开始接听电话")
    conn,addr=server.accept()
    print("电话来了")
    data=conn.recv(1024)
    print("receive:",data)
    conn.send(data.upper())
    server.close()
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    我要开始接听电话
    
    
    
    
    
    
    
    
    
    客户端
    
    
    import socket
    client=socket.socket()
    client.connect(("localhost",6800))
    client.send(b"hello")
    data=client.recv(1024)
    print("receive:",data)
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/clients.py
    receive: b'HELLO'
    
    
    
    
    
    
    
    
    第七周 第十三章节
    
    
    
    
    
    服务端
    
    
    
    
    import socket
    server =socket.socket()
    server.bind(('localhost',6600))
    server.listen(1)    #最大多少个连接,就是可以打开几个窗口
    
    print("我要开始接听电话")
    conn,addr=server.accept()  
    print(conn,addr)
    print("电话来了")
    data=conn.recv(1024)
    print("receive:",data)
    conn.send(data.upper())
    server.close()
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    我要开始接听电话
    <socket.socket fd=292, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6600), raddr=('127.0.0.1', 58933)> ('127.0.0.1', 58933)
    电话来了
    receive: b'xe6x88x91xe8xa6x81xe4xb8x8bxe8xbdxbdxe7x94xb5xe5xbdxb1high'
    
    
    
    客户端:
    
    
    import socket
    client=socket.socket()
    client.connect(("localhost",6600))
    client.send("我要下载电影high".encode('utf-8'))
    data=client.recv(1024)
    print("receive:",data.decode())
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/clients.py
    receive: 我要下载电影HIGH
    
    
    
    
    
    
    
    同时跟一个人往复说话
    
    
    服务端
    
    import socket
    server =socket.socket()
    server.bind(('localhost',6600))
    server.listen(1)
    
    print("我要开始接听电话")
    conn,addr=server.accept() #等电话打过来
    print(conn,addr)
    print("电话来了")
    while True:
        data=conn.recv(1024)
        print("receive:",data)
        conn.send(data.upper())
        server.close()
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/file3.py
    我要开始接听电话
    <socket.socket fd=292, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6600), raddr=('127.0.0.1', 60899)> ('127.0.0.1', 60899)
    电话来了
    receive: b'j'
    receive: b'yh'
    
    
    
    
    
    客户端
    
    
    import socket
    client=socket.socket()
    client.connect(("localhost",6600))
    
    while True:
        inputing=input("please input:")
        client.send(inputing.encode('utf-8'))
        data=client.recv(1024)
        print("receive:",data.decode())
    
    
    
    
    C:Python34python.exe C:/Users/Administrator/PycharmProjects/untitled25/file3/clients.py
    please input:j
    receive: J
    please input:yh
    receive: YH
    please input:
    
    
    
    
    挂起连接: 一个clients断开后,就马上和另一个clilents会话  注意:在linux中操作。
    
    
    
    
    服务端
    
    
    
    import socket
    server =socket.socket()
    server.bind(('localhost',6600))
    server.listen(1)
    
    print("我要开始接听电话")
    while True:
        conn,addr=server.accept() #等电话打过来
        print(conn,addr)
        print("电话来了")
        while True:
            data=conn.recv(1024)
            print("receive:",data)
            if not data:
                print("clients has closed")
            conn.send(data.upper())
    server.close()
    
    
    
    
    
    
    客户端
    
    
    import socket
    client=socket.socket()
    client.connect(("localhost",6600))
    
    while True:
        msg=input("please input:")
        if len(msg) == 0:continue
        client.send(msg.encode('utf-8'))
        data=client.recv(1024)
        print("receive:",data.decode())
    
    
    
    
    
    
    传递Linuc命令:linux上操作
    
    
    服务端
    
    import socket
    import os
    server =socket.socket()
    server.bind(('localhost',6600))
    server.listen(1)  #最大多少个连接,就是可以打开几个窗口
    
    print("我要开始接听电话")
    while True:
        conn,addr=server.accept() #等电话打过来
        print(conn,addr)
        print("电话来了")
        while True:
            data=conn.recv(1024)
            print(data)
            if not data:
                print("clients has closed")
            res=os.popen(data).read()
            conn.send(res)
    server.close()
    
    
    
    客户端:
    
    
    
    import socket
    client=socket.socket()
    client.connect(("localhost",6600))
    
    while True:
        msg=input("please input:")
        if len(msg) == 0:continue
        client.send(msg.encode('utf-8'))
        data=client.recv(1024000)
        print("receive:",data.decode())
    
    
    
    
    
    
    第八周 第四节  socket实现简单ssh的服务
    
    
    
    服务端:
    
    
    import socket
    import os
    server =socket.socket()
    server.bind(('localhost',6600))
    server.listen(1)  #最大多少个连接,就是可以打开几个窗口
    
    print("等待命令输入:")
    while True:
        conn,addr=server.accept() #等电话打过来
        print(addr)
        while True:
            print("等待新指令")
            data=conn.recv(1024)
            if not data:
                print("clients has closed")
                break
    
            print("执行命令:",data)
            cmd_res=os.popen(data.decode()).read() #接受字符串 执行结果也是字符串
            print("before send",len(cmd_res))
            if len(cmd_res)==0:
                cmd_res="cmd has not output"
            conn.send(str(len(cmd_res.encode())).encode("utf-8"))
    
            conn.send(cmd_res.encode("utf-8"))
            print("sent done")
    server.close()
    
    
    
    
    
    
    客户端:
    
    
    
    import socket
    client=socket.socket()
    client.connect(("localhost",6600))
    
    while True:
        cmd=input("please input:")
        if len(cmd) == 0:continue
        client.send(cmd.encode('utf-8'))
        cmd_res_seize=client.recv(1024) #接受命令结果的长度
        print("命令结果大小",cmd_res_seize)
        received_size=0
        while received_size < int(cmd_res_seize.decode()):
            #receieced_seze=0
            data=client.recv(1024)
            received_size +=len(data)
            print(data.decode())
        else:
            print("received done",received_size)
        #cmd_res=client.recv(1024)
        #print(cmd_res.decode())
    
    client.close()
    
    
    
    
    第八周  第六节   命令分开-黏包
    
    
    
    
    服务端:
    
    
    
    import socket
    import os
    server =socket.socket()
    server.bind(('localhost',6600))
    server.listen(1)  #最大多少个连接,就是可以打开几个窗口
    
    print("等待命令输入:")
    while True:
        conn,addr=server.accept() #等电话打过来
        print(addr)
        while True:
            print("等待新指令")
            data=conn.recv(1024)
            if not data:
                print("clients has closed")
                break
    
            print("执行命令:",data)
            cmd_res=os.popen(data.decode()).read() #接受字符串 执行结果也是字符串
            print("before send",len(cmd_res))
            if len(cmd_res)==0:
                cmd_res="cmd has not output"
            conn.send(str(len(cmd_res.encode())).encode("utf-8"))
            client_ack=conn.recv(1024)
            conn.send(cmd_res.encode("utf-8"))
            print("sent done")
    server.close()
    
    
    
    
    客户端:
    
    
    import socket
    client=socket.socket()
    client.connect(("localhost",6600))
    
    while True:
        cmd=input("please input:")
        if len(cmd) == 0:continue
        client.send(cmd.encode('utf-8'))
        cmd_res_seize=client.recv(1024) #接受命令结果的长度
        print("命令结果大小",cmd_res_seize)
        client.send("准备好接受".encode("utf-8"))
        received_size=0
        while received_size < int(cmd_res_seize.decode()):
            #receieced_seze=0
            data=client.recv(1024)
            received_size +=len(data)
            print(data.decode())
        else:
            print("received done",received_size)
        #cmd_res=client.recv(1024)
        #print(cmd_res.decode())
    
    client.close()
    
    
    
    
    
    
    
    
    第十周  第十五章节  Select 解析socket 通讯2
    
    
    
    socket 服务端:
    
    
    import select
    import socket
    import queue
    
    server=socket.socket()
    server.bind(('localhost',6700))
    server.listen(900)
    
    server.setblocking(False)
    inputs=[server,]
    #inputs=[server,conn,conn1,conn2]
    outputs=[]
    
    while True:
        readable,writeable,exceptional=select.select(inputs,outputs,inputs)
        print(readable,writeable,exceptional)
    
        for r in readable:
            if r is server:
                conn,addr=server.accept()
                inputs.append(conn)
                print("来了新连接",addr)
            else:
                data=r.recv(1024)
                print("收到数据",data)
                r.send(data)
                print("sent done")
    
    
    
    
    
    socket 客户端1:
    
    
    
    import socket
    HOST='localhost'
    PORT=6700
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect((HOST,PORT))
    while True:
        msg=bytes(input("please input:"),encoding="utf-8")
        s.send(msg)
        #data=s.recv(1024)
        #print("receive",data)
    s.close()
    
    
    
    
    
    
    
    socket 客户端2:
    
    
    
    import socket
    HOST='localhost'
    PORT=6700
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect((HOST,PORT))
    while True:
        msg=bytes(input("please input:"),encoding="utf-8")
        s.send(msg)
        data=s.recv(1024)
    
    
    
    
    
    
    
    
    
    
    第9周 第五章: 进程与线程
    
    
    
    进程
    
    
    Python多进程multiprocessing使用示例
    
    
    http://outofmemory.cn/code-snippet/2267/Python-duojincheng-multiprocessing-usage-example
    
    
    
    mutilprocess简介
    像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多。
    
    
    
    
    
    
    简单的创建进程
    
    
    import multiprocessing
    
    def worker(num):
        """thread worker function"""
        print ('Worker:', num)
        return
    
    if __name__ == '__main__':
        jobs = []
        for i in range(5):
            p = multiprocessing.Process(target=worker, args=(i,))   #i 就相当于传递了参数,和其他的函数不一样,
            jobs.append(p)
            p.start()
    
    
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi3.py
    Worker: 0
    Worker: 3
    Worker: 2
    Worker: 1
    Worker: 4
    
    
    
    
    
    
    
    线程:
    
    
    Python3入门之线程实例常用方法及属性设置
    
    
    https://www.cnblogs.com/chengd/articles/7766735.html
    
    
    
    什么是线程
    
    
    
    线程是CPU分配资源的基本单位。但一个程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或者多个线程。当没有多线程编程时,一个进程也是一个主线程,但有多线程编程时,一个进程包含多个线程,包括主线程。使用线程可以实现程序的并发。
    
    
    
    
    
    python3中线程模块
    
    
    python3对多线程支持的是 threading 模块,应用这个模块可以创建多线程程序,并且在多线程间进行同步和通信。在python3 中,可以通过两种方法来创建线程(下面列子将以直接在线程中运行函数为主):
    
    
    1.用 threading.Thread 直接在线程中运行函数
    
    
    
    import time
    import threading
    
    def thread_run(name):
        print("%s's first thread!!!"% name)
        time.sleep(5)
    
    mike = threading.Thread(target=thread_run, args=('Mike', ))
    jone = threading.Thread(target=thread_run, args=('jone', ))
    
    mike.start()
    jone.start()
    
    
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi3.py
    Mike's first thread!!!
    jone's first thread!!!
    
    
    
    
    
    
    
    
    单线程:
    
    
    
    好些年前的MS-DOS时代,操作系统处理问题都是单任务的,我想做听音乐和看电影两件事儿,那么一定要先排一下顺序。
    
    (好吧!我们不纠结在DOS时代是否有听音乐和看影的应用。^_^)
    
    https://www.cnblogs.com/fnng/p/3670789.html
    
    
    
    
    from time import ctime,sleep
    
    def music():
        for i in range(2):
            print ("I was listening to music. %s" %ctime())
            sleep(1)
    
    def move():
        for i in range(2):
            print ("I was at the movies! %s" %ctime())
            sleep(5)
    
    if __name__ == '__main__':
        music()
        move()
        print ("all over %s" %ctime())
    
    
    
    
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi56.py
    I was listening to music. Sun May  6 10:29:29 2018
    I was listening to music. Sun May  6 10:29:30 2018
    I was at the movies! Sun May  6 10:29:31 2018
    I was at the movies! Sun May  6 10:29:36 2018
    all over Sun May  6 10:29:41 2018
    
    
    
    
    我们先听了一首音乐,通过for循环来控制音乐的播放了两次,每首音乐播放需要1秒钟,sleep()来控制音乐播放的时长。接着我们又看了一场电影,
    
    每一场电影需要5秒钟,因为太好看了,所以我也通过for循环看两遍。在整个休闲娱乐活动结束后,我通过
    
    print "all over %s" %ctime()
    看了一下当前时间,差不多该睡觉了。
    
    
    
    其实,music()和move()更应该被看作是音乐和视频播放器,至于要播放什么歌曲和视频应该由我们使用时决定。所以,我们对上面代码做了改造:
    
    
    
    
    
    #coding=utf-8
    import threading
    from time import ctime,sleep
    
    def music(func):
        for i in range(2):
            print ("I was listening to %s. %s" %(func,ctime()))
            sleep(1)
    
    def move(func):
        for i in range(2):
            print ("I was at the %s! %s" %(func,ctime()))
            sleep(5)
    
    
    
    if __name__ == '__main__':
        music(u'爱情买卖')
        move(u'阿凡达')
    
        print ("all over %s" %ctime())
    
    
    
    
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi56.py
    I was listening to 爱情买卖. Sun May  6 10:38:18 2018
    I was listening to 爱情买卖. Sun May  6 10:38:19 2018
    I was at the 阿凡达! Sun May  6 10:38:20 2018
    I was at the 阿凡达! Sun May  6 10:38:25 2018
    all over Sun May  6 10:38:30 2018
    
    
    
    
    对music()和move()进行了传参处理。体验中国经典歌曲和欧美大片文化。
    
    
    
    
    
    
    多线程
    
     
    
      科技在发展,时代在进步,我们的CPU也越来越快,CPU抱怨,P大点事儿占了我一定的时间,其实我同时干多个活都没问题的;于是,操作系统就进入了多任务时代。我们听着音乐吃着火锅的不在是梦想。
    
      python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费你和时间,所以我们直接学习threading 就可以了。
    
    继续对上面的例子进行改造,引入threadring来同时播放音乐和视频:
    
    
    
    
    
    #coding=utf-8
    import threading
    from time import ctime,sleep
    
    def music(func):
        for i in range(2):
            print ("I was listening to %s. %s" %(func,ctime()))
            sleep(1)
    
    def move(func):
        for i in range(2):
            print ("I was at the %s! %s" %(func,ctime()))
            sleep(5)
    
    threads = []
    t1 = threading.Thread(target=music,args=(u'爱情买卖',))
    threads.append(t1)
    t2 = threading.Thread(target=move,args=(u'阿凡达',))
    threads.append(t2)
    
    if __name__ == '__main__':
        for t in threads:
            t.setDaemon(True)
            t.start()
    
        print ("all over %s" %ctime())
    
    
    
    运行结果:
    
    E:pythonpython.exe E:/django工程/第20章/app01/cehi56.py
    I was listening to 爱情买卖. Sun May  6 11:13:42 2018
    I was at the 阿凡达! Sun May  6 11:13:42 2018all over Sun May  6 11:13:42 2018
    
    Process finished with exit code 0
    
    
    
    import threading
    
    首先导入threading 模块,这是使用多线程的前提。
    
     
    
    threads = []
    
    t1 = threading.Thread(target=music,args=(u'爱情买卖',))
    
    threads.append(t1)
    
      创建了threads数组,创建线程t1,使用threading.Thread()方法,在这个方法中调用music方法target=music,args方法对music进行传参。 把创建好的线程t1装到threads数组中。
    
      接着以同样的方式创建线程t2,并把t2也装到threads数组。
    
     
    
    for t in threads:
    
      t.setDaemon(True)
    
      t.start()
    
    最后通过for循环遍历数组。(数组被装载了t1和t2两个线程)
    
     
    
    setDaemon()
    
      setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print "all over %s" %ctime()后,没有等待子线程,直接就退出了,同时子线程也一同结束。
    
     
    
    start()
    
    开始线程活动。
    
    
    
    
    从执行结果来看,子线程(muisc 、move )和主线程(print "all over %s" %ctime())都是同一时间启动,但由于主线程执行完结束,所以导致子线程也终止。 
    
    
    
    
    继续调整程序:
    
    
    #coding=utf-8
    import threading
    from time import ctime,sleep
    
    def music(func):
        for i in range(2):
            print ("I was listening to %s. %s" %(func,ctime()))
            sleep(1)
    
    def move(func):
        for i in range(2):
            print ("I was at the %s! %s" %(func,ctime()))
            sleep(5)
    
    threads = []
    t1 = threading.Thread(target=music,args=(u'爱情买卖',))
    threads.append(t1)
    t2 = threading.Thread(target=move,args=(u'阿凡达',))
    threads.append(t2)
    
    if __name__ == '__main__':
        for t in threads:
            t.setDaemon(True)
            t.start()
        t.join()
        print ("all over %s" %ctime())
    
    
    
    
    运行结果:
    
    I was listening to 爱情买卖. Sun May  6 11:26:12 2018
    I was at the 阿凡达! Sun May  6 11:26:12 2018
    I was listening to 爱情买卖. Sun May  6 11:26:13 2018
    I was at the 阿凡达! Sun May  6 11:26:17 2018
    all over Sun May  6 11:26:22 2018
    
    Process finished with exit code 0
    
    
    
    我们只对上面的程序加了个join()方法,用于等待线程终止。join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
    
      注意:  join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。
    
    
    
    
    
    
    从执行结果可看到,music 和move 是同时启动的。
    
      开始时间4分11秒,直到调用主进程为4分22秒,总耗时为10秒。从单线程时减少了2秒,我们可以把music的sleep()的时间调整为4秒。
    
    
    
    #coding=utf-8
    import threading
    from time import ctime,sleep
    
    def music(func):
        for i in range(2):
            print ("I was listening to %s. %s" %(func,ctime()))
            sleep(4)
    
    def move(func):
        for i in range(2):
            print ("I was at the %s! %s" %(func,ctime()))
            sleep(5)
    
    threads = []
    t1 = threading.Thread(target=music,args=(u'爱情买卖',))
    threads.append(t1)
    t2 = threading.Thread(target=move,args=(u'阿凡达',))
    threads.append(t2)
    
    if __name__ == '__main__':
        for t in threads:
            t.setDaemon(True)
            t.start()
        t.join()
        print ("all over %s" %ctime())
    
    
    
    运行结果:
    
    
    
    I was listening to 爱情买卖. Sun May  6 11:24:44 2018
    I was at the 阿凡达! Sun May  6 11:24:44 2018
    I was listening to 爱情买卖. Sun May  6 11:24:48 2018
    I was at the 阿凡达! Sun May  6 11:24:49 2018
    all over Sun May  6 11:24:54 2018
    
    
    
    
    子线程启动11分27秒,主线程运行11分37秒。
    
      虽然music每首歌曲从1秒延长到了4 ,但通多程线的方式运行脚本,总的时间没变化。
    
    
    
    
    
    
    
    
    
    
    第十周 第十六章节:Select 解析socket 通信3
    
    
    
    
    
    socket 服务端:
    
    
    
    
    import select
    import socket
    import queue
    
    server=socket.socket()
    server.bind(('localhost',6700))
    server.listen(900)
    
    server.setblocking(False)
    msg_dic = {}
    inputs=[server,]
    #inputs=[server,conn,conn1,conn2]
    outputs=[]
    while True:
        readable,writeable,exceptional=select.select(inputs,outputs,inputs)
        print(readable,writeable,exceptional)
    
        for r in readable:
            if r is server:
                conn,addr=server.accept()
                inputs.append(conn)
                print("来了新连接",addr)
                msg_dic[conn]=queue.Queue() #初始化一个队列
            else:
                data=r.recv(1024)
                print("收到数据",data)
                msg_dic[r].put(data) #放入返回的连接队列
                outputs.append(r)
    
        for w in writeable:  #要返回给客户的连接列表
                data_to_clients=msg_dic[w].get()
                w.send(data_to_clients) #返回个客户源数据
                outputs.remove(w)
        for e in exceptional:
            if e in outputs:
                outputs.remove(e)
            else:
                inputs.remove(e)
                del msg_dic[e]
    
    
    
    
    
    socket 客户端:
    
    
    
    import socket
    HOST='localhost'
    PORT=6700
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect((HOST,PORT))
    while True:
        msg=bytes(input("please input:"),encoding="utf-8")
        s.sendall(msg)
        data=s.recv(1024)
        print("receive:",data)
    s.close()
    
    
    
    
    
    第十一周  第三章  RabbitMQ基本操作
    
    
    生产者:
    
    
    import pika
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1'))
    channel = connection.channel()
    channel.queue_declare(queue='hello')
    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='hello word')
    
    print("[x]sent hello word")
    connection.close()
    
     
    
    
    消费者:
    
    
    import pika
    connection=pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel=connection.channel()
    channel.queue_declare(queue='hello')
    def callback(ch,method,propreties,body):
        print("-->",ch,method,propreties)
        print("[x] recieved %r" % body)
    
    
    channel.basic_consume(callback,queue='hello',no_ack=True)
    print('[*] watting fir messages, To exit press CTRL+C')
    channel.start_consuming()
    
    
    
    
    
    
    第十四周 第七章: html的内部标签
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!--<div></div>-->
        <a href="http://oldboyedu.com">老男孩</a>
    </body>
    </html>
    
    
    
    
    
    第十四周 第八章 html的body内部标签
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!--<div></div>-->
        <p>klkklkkllkkkkkkk<br  />kkkkkkkkkkkkkkklklk</p>
        <p>555555555</p>
        <p>8888888888</p>
        <h1>8888</h1>
        <h2>8888</h2>
        <h3>8888</h3>
        <h4>8888</h4>
        <h5>8888</h5>
        <h6>8888</h6>
        <span>66666</span>
        <span>66666</span>
        <span>66666</span>
    
        <a href="http://oldboyedu.com">老男孩      <a&gt公园</a>
    </body>
    </html>
    
    
    
    
    
    第十四周 第八章 chrome 查看html的基本样式
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>hello</title>
    </head>
    <body>
        come on
        <div>
            <div id="i1">hello</div>
        </div>
        <a href="http://oldboyedu.com">自然      <a&gt公园</a>
    </body>
    </html>
    
    
    
    
    第十四周 第十章  html的body内标签input系列
    
    
    
    
    服务端:
    
    
    
    import tornado.ioloop
    import tornado.web
    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            print(111)
            u=self.get_argument('user')
            e=self.get_argument("email")
            p=self.get_argument("pwd")
            if u == 'bob' and e == 'bob@123.com' and p == '123':
                self.write('ok')
            else:
                self.write('输入错误')
            self.write("GET")
        def post(self,*args,**kwargs):
            print(222)
            self.write("POST")
    
    application = tornado.web.Application([
        (r"/index", MainHandler),
    ])
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    
    
    
    
    客户端:
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="http://localhost:8888/index" method="post">
            <input type="text" name="user" />
            <input type="text" name="email" />
            <input type="password" name="pwd"/>
            <input type="button" value="登陆1" />
            <input type="submit" value="登陆2" />
            <!--{'user':'用户输入的用户','email':'xx','pwd':'xx'}-->
        </form>
        <br>
        <form>
        <input type="text"  />
        <input type="password"  />
        <input type="button" value="登陆" />
        <input type="submit" value="登陆" />
        </form>
    </body>
    </html>
    
    
    
    
    第十四周 第十一章  html的body内标签input系列
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form enctype="multipart/form-data">
            <div>
                <p>请选择性别:</p>
                男:<input type="radio" name="gender" value="1"/>
                女:<input type="radio" name="gender" value="2"/>
                <p>爱好:</p>
                篮球:<input type="checkbox" name="favor" value="1" checked="checked"/>
                足球:<input type="checkbox" name="favor" value="2"/>
                拍球:<input type="checkbox" name="favor" value="3" />
                棒球:<input type="checkbox" name="favor" value="4"/>
                <p>技能</p>
                唱歌:<input  type="checkbox" name="skill"/>
                跳舞:<input  type="checkbox" name="skill"/>
                <p>上传文件</p>
                <input  type="file" name="fname"/>
                <br>
                <!--<span>rttttttt</span>-->
            </div>
            <input type="submit" value="提交" />
            <input type="reset" value="重置" />
        </form>
    </body>
    </html>
    
    
    
    
    第十四周 第十二章  html的body内标签多行文本以及下拉框
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <form enctype="multipart/form-data">
    
            <select name="city" size="10" multiple="multiple">
                <option value="1">北京</option>
                <option value="2">上海</option>
                <option value="3" selected="selected">广州</option>
            </select>
            <div>
                <p>请选择性别:</p>
                男:<input type="radio" name="gender" value="1"/>
                女:<input type="radio" name="gender" value="2"/>
                <p>爱好:</p>
                篮球:<input type="checkbox" name="favor" value="1" checked="checked"/>
                足球:<input type="checkbox" name="favor" value="2"/>
                拍球:<input type="checkbox" name="favor" value="3" />
                棒球:<input type="checkbox" name="favor" value="4"/>
                <p>技能</p>
                唱歌:<input  type="checkbox" name="skill"/>
                跳舞:<input  type="checkbox" name="skill"/>
                <p>上传文件</p>
                <input  type="file" name="fname"/>
                <br>
                <!--<span>rttttttt</span>-->
    
            </div>
            <textarea name="menber">hhhh</textarea>
            <input type="submit" value="提交" />
            <input type="reset" value="重置" />
            
        </form>
    
    </body>
    </html>
    
    
    
    
    第十四周 第十三章 html的body内标签超链接
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <a href="#i1">第一章</a>
        <a href="#i2">第二章</a>
        <a href="#i3">第三章</a>
        <a href="#i4">第四章</a>
        <div id="i1" style="height:600px">第一章的内容</div>
        <div id="i2" style="height:600px">第二章的内容</div>
        <div id="i3" style="height:600px">第三章的内容</div>
        <div id="i4" style="height:600px" >第四章的内容</div>
    </body>
    </html>
    
    
    
    
    
    第十四周 第十四章 html的body内标图片及表格
    
    标准格式按照十五章
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <a href="http://www.baidu.com">
            <img src="0.jpg" title="美女" style="height: 200px;  200px;" alt="美女">
        </a>
        <ul>
            <li>yyyy</li>
            <li>yyyy</li>
            <li>yyyy</li>
            <li>yyyy</li>
    
        </ul>
        <ol>
            <li>xxx</li>
            <li>xxx</li>
            <li>xxx</li>
            <li>xxx</li>
        </ol>
    
        <dl>
            <dt>kkk</dt>
            <dd>uuu</dd>
            <dd>uuu</dd>
            <dd>uuu</dd>
            <dd>uuu</dd>
            <dt>kkk</dt>
            <dd>uuu</dd>
            <dd>uuu</dd>
            <dd>uuu</dd>
            <dd>uuu</dd>
        </dl>
    </body>
    </html>
    
    
    
    表格:
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <table border="1">
            <tr>
                <td>主机名</td>
                <td>端口</td>
                <td>操作</td>
            </tr>
            <tr>
                <td>0.0.0.0</td>
                <td>8080</td>
                <td>
                    <a href="https://www.baidu.com">查看信息</a>
                    <a href="https://www.baidu.com">修改</a>
                </td>
            </tr>
            <tr>
                <td>0.0.0.0</td>
                <td>8080</td>
                <td>第二行,第3列</td>
            </tr>
        </table>
    </body>
    </html>
    
    
    
    
    
    
    第十四周 第十五章 html的body内标图片及表格
    
    
    
    标准格式按照这个
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <table border="1">
        <thead>
        <tr>
            <th>表头1</th>
            <th>表头1</th>
            <th>表头1</th>
            <th>表头1</th>
        </tr>
        </thead>
    
        <tbody>
        <tr>
            <th>1</th>
            <th colspan="2">1</th>
            <th>1</th>
            <!--<th>1</th>-->
        </tr>
        <tr>
            <th rowspan="2">1</th>
            <th>1</th>
            <th>1</th>
            <th>1</th>
        </tr>
        <tr>
            <th>1</th>
            <th>1</th>
            <th>1</th>
            <!--<th>1</th>-->
        </tr>
        <tr>
            <th>1</th>
            <th>1</th>
            <th>1</th>
            <th>1</th>
        </tr>
        <tr>
            <th>1</th>
            <th>1</th>
            <th>1</th>
            <th>1</th>
        </tr>
        </tbody>
    </table>
    </body>
    </html>
    
    
    
    
    第十四周 第十六章 html的body的fildest标签和lable标签
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <label for="username">用户名:</label>
        <input id="username" type="text" name="user"/>
    </body>
    </html>
    
    
    
    
    
    底下情况基本不用
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <fieldset>
            <legend>登录</legend>
            <label for="username">用户名:</label>
            <input id="username" type="text" name="user"/>
            <br>
            <label for="pwd">密码: </label>
            <input id="pwd" type="text" name="user"/>
        </fieldset>
    </body>
    </html>
    
    
    
    
    
    第十四周 第十八章 css选择器:
    
    
    
    id选择器:不常用
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #i1{
                background-color: brown;
                height: 58px
            }
            #i2{
                background-color: #32CD32;
                height: 58px
            }
            #i3{
                background-color: #27408B;
                height: 58px
            }
        </style>
    </head>
        <div id="i1">fff</div>
        <div id="i2">2</div>
        <div id="i3" >2</div>
    <body>
    
    </body>
    </html>
    
    
    
    
    
    class选择器:最常用的方式:
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            #i1{
                background-color: brown;
                height: 58px
            }
            #i2{
                background-color: #32CD32;
                height: 58px
            }
            #i3{
                background-color: #27408B;
                height: 58px
            }
            .c1{
                background-color: #B8860B;
                height: 20px;
            }
        </style>
    </head>
        <div class="c1">fff</div>
        <div class="c1">2</div>
        <div class="c1" >2</div>
    <body>
    
    </body>
    </html>
    
    
    
    标签选择器:
    
    注释:/*background-color: brown;*/
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
            div{
                background-color: #B8860B;
                color: red;
            }
        </style>
    </head>
        <div class="c1">fff</div>
        <span class="c1">2
            <div>hhhhh</div>
        </span>
        <div class="c1" >2</div>
    <body>
    
    </body>
    </html>
    
    
    
    
    层级选择器:
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
            .c1 div{
                background-color: #B8860B;
                color: red;
            }
        </style>
    </head>
        <div class="c1">fff</div>
        <span class="c1">2
            <div id="c2">hhhhh</div>
        </span>
        <div class="c1" >2</div>
    <body>
    
    </body>
    </html>
    
    
    
    组合选择器:
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
            #i1,#i2,#i3{
                background-color: #B8860B;
                color: red;
            }
        </style>
    </head>
        
    <body>
        <div id="i1">fff</div>
    
        <div id="i2">hhhhh</div>
    
        <div id="i3" >2</div>
    </body>
    </html>
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
            .i1,.i2,.i3{
                background-color: #B8860B;
                color: red;
            }
        </style>
    </head>
    
    <body>
        <div class="i1">fff</div>
    
        <div class="i2">hhhhh</div>
    
        <div class="i3" >2</div>
    </body>
    </html>
    
    
    
    
    
    属性选择器:
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
           input[type="text"]{background-color: #B8860B;
                color: red;}
        </style>
    </head>
    
    <body>
        <input type="text"/>
        <input type="password"/>
    </body>
    </html>
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
           .c1[name="job"]{background-color: #B8860B; 80px;height: 100px;
                color: red;}
        </style>
    </head>
    
    <body>
        <input class="c1" type="text" name="job"/>
        <input type="password"/>
    </body>
    </html>
    
    
    
    
    
    
    第十四周 第十九章  css存在样式、优先级
    
    
    
    叠加
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
           .c1{background-color:yellow;
                color: yellow;}
           .c1{font-size: 60px;
                }
        </style>
    </head>
    
    <body>
        <div class="c1 c2">hhhhhhh</div>
    </body>
    </html>
    
    
    
    
    优先级: style 最优先  然后最下面的  然后最上面的
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
           .c1{background-color:yellow;
                color: yellow;}
           .c1{font-size: 60px;
               color: black;
                }
        </style>
    </head>
    
    <body>
        <div class="c1 c2" style="color: deeppink">hhhhhhh</div>
    </body>
    </html>
    
    
    
    
    css样式也可以写在单独文件中:
    
    
    1.1 先写个  css文件:
    
    
    
    .c1 {
        background-color: yellow;
        color: yellow;
    }
    
    .c1 {
        font-size: 60px;
        color: black;
    }
    
    
    1.2 再导入:
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="daoru.css" />
    </head>
    <body>
        <div class="c1 c2" style="color: deeppink">hhhhhhh</div>
        <div class="c1 c2" style="color: deeppink">hhhhhhh</div>
        <div class="c1 c2" style="color: deeppink">hhhhhhh</div>
    </body>
    </html>
    
    
    
    
    
    
    
    
    第十四周 第二十章:css边框以及其他常用样式:
    
    
    
    
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div style="border: 1px solid red">
            hhhhhh
        </div>
        <div style="height: 50px; 50%;border: 1px solid red;font-size: 18px;text-align: center;line-height: 50px;font-weight: bolder">
            kkkkkk
        </div>
    </body>
    </html>
    
    
    
    
    
    
    
    第十四周 第二十一章节:css的float样式
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .pg-header{
                height: 50px;
                background-color: aqua;
                line-height: 50px;
            }
        </style>
    </head>
    <body style="margin: 0 auto">
        <div class="pg-header">
            <div style="float: left">收藏本站</div>
            <div style="float: right">
                <a>登录</a>
                <a>注册</a>
            </div>
        </div>
        <br>
        <div style=" 300px;border:1px solid red;">
            <div style=" 96px;height: 30px;border:1px solid green;float: left"></div>
            <div style=" 96px;height: 30px;border:1px solid green;float: left"></div>
            <div style=" 96px;height: 30px;border:1px solid green;float: left"></div>
            <div style=" 96px;height: 30px;border:1px solid green;float: left"></div>
            <div style=" 96px;height: 30px;border:1px solid green;float: left"></div>
            <div style=" 96px;height: 30px;border:1px solid green;float: left"></div>
            <div style=" 96px;height: 30px;border:1px solid green;float: left"></div>
            <div style="clear: both"></div>
        </div>
    </body>
    </html>
    
    
    
    
    
    
    第十五周  第三章  css内容 position
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div onclick="GoTop();" style="height: 50px; 50px;background-color: red;color: black;position: fixed;
        bottom: 20px;
        right: 20px;
        ">返回顶部
    </div>
    <div style="height:5000px;background-color: green"></div>
    
    <script>
        function GoTop() {
            document.body.scrollTop = 0;
        }
    </script>
    </body>
    </html>
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .pg-header{
                height: 50px;
                background-color: red;
                color: aqua;
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
            }
        </style>
        <style>
            .pg-body{
                height: 5000px;
                background-color: green;
                color: blue;
                margin-top: 50px;
            }
        </style>
    </head>
    <body>
        <div class="pg-header">头部</div>
        <div class="pg-body">内容</div>
    </body>
    </html>
    
    
    
    
    
    
    第十五周  第四章 css内容 position
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div style=" 50px;height: 50px;background-color: black;position: absolute;right: 0;bottom: 0">
            kkkkk
        </div>
        <div style="height: 5000px;background-color: aqua">
            hhhh
        </div>
    </body>
    </html>
    
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div style="position: relative; 300px;height: 100px;border: 1px solid red;margin: 0 auto">
            <div style="height: 50px; 50px;position: absolute;right: 0;bottom: 0;background-color: black"></div>
        </div>
    
        <div style="position: relative; 300px;height: 100px;border: 1px solid red;margin: 0 auto">
            <div style="height: 50px; 50px;position: absolute;left: -70px;bottom: 0;background-color: black"></div>
        </div>
    
        <div style="position: relative; 300px;height: 100px;border: 1px solid red;margin: 0 auto"></div>
    </body>
    </html>
    
    
    
    
    
    第十五周  第五章 css内容 position   多层堆叠
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div style="z-index:10;position: fixed;background-color: white;height: 200px; 300px;top: 50%;left: 50%;margin-left: -150px;margin-top: -100px"></div>
        <div style="z-index:9;position: fixed;background-color: black;top: 0;bottom: 0;left: 0;right: 0;opacity: 0.6"></div>
        <div style="height: 5000px;background-color: green"></div>
    </body>
    </html>
    
    
    
    
    
    第十五周  第六章 css内容 overflow
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div style="height: 200px; 300px;overflow: hidden">
            <img src="0.jpg">
        </div>
        <div style="height: 200px; 300px;overflow: auto">
            <img src="0.jpg">
        </div>
    </body>
    </html>
    
    
    
    
    第十五周  第七章 css内容 hover:
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .pg-header{
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                height: 50px;
                background-color: blue;
                line-height: 50px;
            }
    
            .pg-body{
                margin-top: 55px;
    
            }
            .w{
                 980px;
                margin: 0 auto;
            }
            .pg-header .menue{
                display: inline-block;
                padding: 0 10px 0 10px;
                color: white;
            }
            .pg-header .menue:hover{
                background-color: blue;
            }
        </style>
    </head>
    <body>
        <div class="pg-header">
            <div class="w">
                <a class="logo"></a>
                <a class="menue">全部</a>
                <a class="menue">42区</a>
                <a class="menue">段子</a>
                <a class="menue">1024</a>
            </div>
        </div>
        <div class="pg-body">
            <div class="w">hhh</div>
        </div>
    </body>
    </html>
    
    
    
    
    
    
    第十五周  第八章 css内容 backgroud;   点赞图标上下移动
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div style="height: 100px"></div>
        <div style="background-image: url(1..png);height: 20px;20px;border:1px solid red;background-repeat: no-repeat;background-position-x: 0px;background-position-y: -10px"></div>
    </body>
    </html>
    
    
    
    
    
    第十五周  第九章 css内容 backgroud;   登录框放个图标
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <div style="height: 38px; 400px;position: relative">
            <input type="text" style="height: 38px; 350px;padding-right: 50px" />
            <span style="background-image: url(u=3520327743,3495362103&fm=200&gp=0.jpg);display: inline-block;height: 30px; 30px;position: absolute;right: 0;top: 5px"></span>
        </div>
    </body>
    </html>
    
    
    
    
    
    第十五周  第十一章节  javascript代码存在形式
    
    1、直接写
    
    2、从远程导入
    
    
    3、要写在body的最后面
    
    
    4、注释: 单行  //     多行: /*   */
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    
        <script src=""></script>
        <script>
            
        </script>
    </body>
    </html>
    
    
    
    
    
    
    
    第十五周  第十三章节:javascript字符串操作以及跑马灯实例     一串文字一直循环
    
    
    1、
    
    a="alex"
    
    a.charAt(2)
    "e"
    
    a.charAt(0)
    "a"
    
    2、
    
    substring :获取全部内容
    
    a.substring(1,3)
    
    
    "le"
    
    
    
    a="bob"
    
    
    "bob"
    
    
    
    3、
    
    a.length
    
    
    3
    
    
    
    
    定时器:
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script>
            setInterval("alert(123)",5000)
        </script>
    </body>
    </html>
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script>
            function fun1(){
                console.log(2)
            }
            setInterval("fun1();",5000);
        </script>
    </body>
    </html>
    
    
    
    
    一串文字一直循环
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="i1">欢迎顾客前来购买</div>
        <script>
            function func2(){
                var tag=document.getElementById('i1');
                var content=tag.innerText;
                var f=content.charAt(0);
                var k=content.substring(1,content.length);
                var new_content=k+f;
                tag.innerText=new_content
            }
            setInterval('func2();',200);
        </script>
    
    </body>
    </html>
    
    
    
    
    
    第十五周  第十四章节 javascript的数组、字典、for循环
    
    
    
    
    第十五周  第十五章节 javascript的条件语句:
    
    
    if(){
    
    }else if(条件){
    
    }else if(条件){
    
    }else{
    
    }
    
    
    
    if(1==1){
    
    }
    
    
    if(1!==1){
    
    }
    
    
    值相等就行
    
    1=="1"
    
    true
    
    
    
    值和类型都要相等
    
    1==="1"
    
    false
    
    
    
    if(1==1 && 2==2)
    
    
    if(1==1 || 2==2)
    
    
    
    
    
    第十五周  第十六章节 javascript的函数定义:
    
    
    
    
    function func1(a,b,c){
                
                
            }
    
    调用:函数名(1,2,3)
    
    
    
    
    
    
    第十五周  第十七章节  DOM 选择器:
    
    
    1、查找标签:
    
    获取单个元素:document.getElementById('i1')
    
    
    获取多个元素(列表):document.getElementsByTagName('div')
    
    获取多个元素(列表):document.getElementsByClassName('c1')
    
    	a、直接找:
    		document.getElementById               根据ID获取一个标签
    		
    		document.getElementsByTagName         根据name属性获取标签集合
    
    		document.getElementsByClassName	       根据class属性获取标签集合
    
    		document.getElementsByTagName	       根据签名获取标签属性
    
    
    	b、间接
    
    
    		parentElement                父亲节点标签
    		children		     所有子标签
    		firstElementCild	     第一个子标签
    		lastElementChild	     最后一个子标签
    		nextElementSibling	     下一个兄弟标签
    		previousElementSibling	     上一个兄弟标签
    		
    
    
    
    
    
    2、操作标签:
    
    
    a、innerText
    
    	获取标签里面的内容
    
    	标签.innerText
    
    
    	对标签的内部内容进行重新赋值:
    
    	标签.innerText=""
    
    
    b、classname
    	tag.classname  整体操作
    	tag.classList.add() 添加
    	tag.classList.remove()  删除
    	
    
    	
    
    
    
    
    
    
    
    实例:
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="i1">我的中国心</div>
        <a>hhh</a>
        <a>kkkk</a>
        <a>tttt</a>
    </body>
    </html>
    
    
    
    
    运行:
    
    
    for(var i=1;i<tags.length;i++){tags[i].innerText='zzz'}
    
    "zzz"
    
    
    
    
    
    第十五周  第十八章节  DOM间 选择器
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div></div>
            <div></div>
            <div>
                a1
            </div>
        <div>
            <div></div>
            <div id="i1">
                a2
            </div>
        </div>
        <div>
            <div></div>
            <div>
                a3
            </div>
        </div>
    </body>
    </html>
    
    
    
    tag=document.getElementById('i1')
    
    
    <div id=?"i1">?
                a2
            ?</div>?
    
    
    
    
    tag.className='c1';
    
    
    "c1"
    
    
    tag
    
    
    <div id=?"i1" class=?"c1">?
                a2
            ?</div>?
    
    
    
    
    tag.classList
    
    
    ["c1", value: "c1"]
    
    
    
    tag.classList.add('c5')
    
    undefined
    
    
    tag
    
    <div id=?"i1" class=?"c1 c5">?
                a2
            ?</div>?
    
    
    
    tag.classList.remove('c5')
    
    undefined
    
    
    
    tag
    
    <div id=?"i1" class=?"c1">?
                a2
            ?</div>?
    
    
    
    
    <div onclick="fun();">点我</div>
        <script>
            function func(){
                
            }
        </script>
    
    
    
    
    
    
    第十五周  第十九章节   模态对话框
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide {
                display: none;
            }
    
            .c1 {
                position: fixed;
                top: 0;
                bottom: 0;
                left: 0;
                right: 0;
                background-color: black;
                opacity: 0.6;
                z-index: 9;
    
            }
    
            .c2 {
                 500px;
                height: 400px;
                background-color: white;
                position: fixed;
                left: 50%;
                top: 50%;
                margin-left: -250px;
                margin-top: -200px;
                z-index: 10;
    
            }
        </style>
    </head>
    <body style="margin: 0">
    <div>
        <input type="button" value="添加" onclick="ShowMode()"/>
        <table>
            <thead>
            <tr>
                <th>主机名</th>
                <th>端口</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>192.168.1</td>
                <td>4231</td>
            </tr>
            <tr>
                <td>192.168.2</td>
                <td>4232</td>
            </tr>
            <tr>
                <td>192.168.3</td>
                <td>4233</td>
            </tr>
            </tbody>
        </table>
    </div>
    <!--遮挡层开始-->
    <div id="i1" class=" c1 hide">
        <!--遮挡层结束-->
    </div>
    <!--弹出框开始-->
    <div id="i2" class="c2 hide">
        <p><input type="text"></p>
        <p><input type="text"></p>
        <p>
            <input type="button" value="确定"/>
            <input type="button" value="取消" onclick="HideMode1()"/>
        </p>
    </div>
    <!--弹出框结束-->
    <script>
        function ShowMode() {
    
            document.getElementById('i1').classList.remove('hide')
            document.getElementById('i2').classList.remove('hide')
        }
        function HideMode1() {
    
            document.getElementById('i1').classList.add('hide')
            document.getElementById('i2').classList.add('hide')
        }
    </script>
    
    </body>
    </html>
    
    
    
    
    
    
    第十五周  第二十章节  全选、反选、取消
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide {
                display: none;
            }
    
            .c1 {
                position: fixed;
                top: 0;
                bottom: 0;
                left: 0;
                right: 0;
                background-color: black;
                opacity: 0.6;
                z-index: 9;
    
            }
    
            .c2 {
                 500px;
                height: 400px;
                background-color: white;
                position: fixed;
                left: 50%;
                top: 50%;
                margin-left: -250px;
                margin-top: -200px;
                z-index: 10;
    
            }
        </style>
    </head>
    <body style="margin: 0">
    <div>
        <input type="button" value="添加" onclick="ShowMode()"/>
        <input type="button" value="全选" onclick="Chooseall()"/>
        <input type="button" value="取消" onclick="Cancall()"/>
        <input type="button" value="反选" onclick="Reverseall()"/>
        <table>
            <thead>
            <tr>
                <th>选择</th>
                <th>主机名</th>
                <th>端口</th>
            </tr>
            </thead>
            <tbody id="tb">
            <tr>
                <td><input type="checkbox"/></td>
                <td>192.168.1</td>
                <td>4231</td>
            </tr>
            <tr>
                <td><input type="checkbox"/></td>
                <td>192.168.2</td>
                <td>4232</td>
            </tr>
            <tr>
                <td><input type="checkbox"/></td>
                <td>192.168.3</td>
                <td>4233</td>
            </tr>
            </tbody>
        </table>
    </div>
    <!--遮挡层开始-->
    <div id="i1" class=" c1 hide">
        <!--遮挡层结束-->
    </div>
    <!--弹出框开始-->
    <div id="i2" class="c2 hide">
        <p><input type="text"></p>
        <p><input type="text"></p>
        <p>
            <input type="button" value="确定"/>
            <input type="button" value="取消" onclick="HideMode1()"/>
        </p>
    </div>
    <!--弹出框结束-->
    <script>
        function ShowMode() {
    
            document.getElementById('i1').classList.remove('hide');
            document.getElementById('i2').classList.remove('hide')
        }
        function HideMode1() {
    
            document.getElementById('i1').classList.add('hide');
            document.getElementById('i2').classList.add('hide')
        }
        function Chooseall() {
            var tbody = document.getElementById('tb');
            var tb_list = tbody.children;
            for(var i = 0; i < tb_list.length; i++){
                var td_children=tb_list[i];
                var check_box = td_children.children[0].children[0];
                check_box.checked = true;
                }
        }
        function Cancall() {
            var tbody = document.getElementById('tb');
            var tb_list = tbody.children;
            for(var i = 0; i < tb_list.length; i++){
                var td_children=tb_list[i];
                var check_box = td_children.children[0].children[0];
                check_box.checked = false;
                }
        }
    
        function Reverseall() {
            var tbody = document.getElementById('tb');
            var tb_list = tbody.children;
            for(var i = 0; i < tb_list.length; i++){
                var td_children=tb_list[i];
                var check_box = td_children.children[0].children[0];
                if(check_box.checked){
                    check_box.checked = false;
                }else {
                    check_box.checked = true;
                    }
    
                }
    
        }
    
    </script>
    
    </body>
    </html>
    
    
    
    
    
    
    第十五周  第二十一章节  javascript 必须加分号
    
    
    
    第十五周  第二十二章节  后台左侧菜单:
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
            .item .header{
                height: 38px;
                background-color: green;
                color: black;
                line-height: 38px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px"></div>
        <div style=" 300px;">
            <div class="item">
                <div id="i1" class="header" onclick="changemenue('i1');">菜单1</div>
                <div class="content hide">
                    <div>内容1</div>
                    <div>内容2</div>
                    <div>内容3</div>
                </div>
            </div>
            <div class="item">
                <div id="i2" class="header" onclick="changemenue('i2');">菜单2</div>
                <div class="content hide">
                    <div>内容2</div>
                    <div>内容2</div>
                    <div>内容2</div>
                </div>
            </div>
            <div class="item">
                <div id="i3" class="header " onclick="changemenue('i3');">菜单3</div>
                <div class="content hide">
                    <div>内容3</div>
                    <div>内容3</div>
                    <div>内容3</div>
                </div>
            </div>
            <div class="item">
                <div id="i4" class="header " onclick="changemenue('i4');">菜单4</div>
                <div class="content hide">
                    <div>内容4</div>
                    <div>内容4</div>
                    <div>内容4</div>
                </div>
            </div>
        </div>
    
        <script>
            function changemenue(nid){
                var current_header=document.getElementById(nid);
                var item_list=current_header.parentElement.parentElement.children;
    
                for(var i=0;i<item_list.length;i++){
                    var item_current = item_list[i];
                    item_current.children[1].classList.add('hide');
                }
                current_header.nextElementSibling.classList.remove('hide');
    
            }
        </script>
    </body>
    </html>
    
    
    
    
    
    第十六周  第三章   css内容补充、后台管理页面
    
    
    
    第十六周  第十七章  鼠标拿走在框里显示 请输入内容
    
    
    第十六周  第十九章  创建标签,在标签下面再创建标签
    
    
    
    
    
    第 十七周 03章节      jquery常用的就是讲的这些,其他的可以不会
    
    
    
    jquery和dom之间转换
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="i1">123</div>
        <script src="jquery-3.3.1.js"></script>
    </body>
    </html>
    
    
    
    $("#i1")
    jQuery.fn.init?[div#i1]
    
    
    document.getElementById('i1')
    <div id="i1">123</div>
    
    
    jquery转dom
    $("#i1")[0]
    <div id="i1">123</div>
    
    
    dom转jquery
    d=document.getElementById('i1')
    <div id="i1">123</div>
    $(d)
    jQuery.fn.init?[div#i1]
    
    
    
    
    
    
    第17周 04章节  多选  反选  取消
    
    
    
    
    
    1、组合选择标签:
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script src="jquery-3.3.1.js"></script>
        <div id="i10" class="c1">
            <a>f</a>
            <a>f</a>
        </div>
        <div class="c1">
            <a>f</a>
        </div>
        <div class="c1">
            <div class="c2"></div>
        </div>
    </body>
    </html>
    
    
    
    
    $('a,.c2,#i10')
    jQuery.fn.init(5)?[div#i10.c1, a, a, a, div.c2, prevObject: jQuery.fn.init(1)]
    
    
    
    
    
    2、层级:选多个子标签
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script src="jquery-3.3.1.js"></script>
        <div id="i10" class="c1">
            <div>
                <a>hhhh</a>
            </div>
            <a>f</a>
            <a>f</a>
        </div>
        <div class="c1">
            <a>f</a>
        </div>
        <div class="c1">
            <div class="c2"></div>
        </div>
    </body>
    </html>
    
    
    $('#i10 a')
    jQuery.fn.init(3)?[a, a, a, prevObject: jQuery.fn.init(1)]
    
    
    
    $('#i10>a')
    jQuery.fn.init(2)?[a, a, prevObject: jQuery.fn.init(1)]
    
    
    $('#i10 a:eq(0)')
    jQuery.fn.init?[a, prevObject: jQuery.fn.init(1)]
    
    
    
    3、属性选择器:
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script src="jquery-3.3.1.js"></script>
        <div id="i10" class="c1">
            <div>
                <a>hhhh</a>
            </div>
            <a bob="123">f</a>
            <a bob="456">f</a>
        </div>
        <div class="c1">
            <a>f</a>
        </div>
        <div class="c1">
            <div class="c2"></div>
        </div>
    </body>
    </html>
    
    
    
    $('[bob]')
    jQuery.fn.init(2)?[a, a, prevObject: jQuery.fn.init(1)]
    
    
    $('[bob="123"]')
    jQuery.fn.init?[a, prevObject: jQuery.fn.init(1)]
    
    
    
    
    第17周 05章节  多选  反选  取消  删选器以及Tab菜单示例
    
    
    $(this).prop('checked');   获取值
    
    $(this).prop('checked',v); 设置值
    
    jQuery内置循环:(this).prop('checked')each({})
    
    三元运算:var v=$(this).prop('checked')?false:true;
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <input type="button" value="全选" onclick="checkAll();">
        <input type="button" value="取消" onclick="cancelAll();">
        <input type="button" value="反选" onclick="reverseAll();">
        <table border="1">
            <thead>
                <tr>
                    <th>选项</th>
                    <th>ip</th>
                    <th>端口</th>
                </tr>
            </thead>
            <tbody >
                <tr>
                    <td><input type="checkbox"></td>
                    <td>1.1.1.1</td>
                    <td>80</td>
                </tr>
                <tr>
                    <td><input type="checkbox"></td>
                    <td>1.1.1.1</td>
                    <td>80</td>
                </tr>
                <tr>
                    <td><input type="checkbox"></td>
                    <td>1.1.1.1</td>
                    <td>80</td>
                </tr>
                <tr>
                    <td><input type="checkbox"></td>
                    <td>1.1.1.1</td>
                    <td>80</td>
                </tr>
            </tbody>
        </table>
        <script src="jquery-3.3.1.js"></script>
        <script>
            function checkAll(){
                $(":checkbox").prop('checked',true);
            }
            function cancelAll(){
                $(":checkbox").prop('checked',false);
            }
            function reverseAll(){
                $(':checkbox').each(function(k){
                   /* if ($(this).prop('checked')){
                        $(this).prop('checked', false)
                    }
                    else {
                        $(this).prop('checked', true)
                    } */
                    var v=$(this).prop('checked')?false:true;
                    $(this).prop('checked',v);
    
                })
            }
        </script>
    </body>
    </html>
    
    
    
    
    第17周 06章节  删选器2 点击后展开
    
    
    绑定事件
    
    兄弟标签 父标签  children标签  next()标签  preve()标签   find()
    
    链式编程
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .header{
                background: black;
                color: wheat;
            }
            .content{
                height: 50px;
            }
            .hide{
                display: none;
            }
        </style>
    </head>
    <body>
        <div style="height: 400px; 200px;border: 1px solid red">
            <div class="item">
                <div class="header" >标题1</div>
                <div class="content hide">内容</div>
            </div>
            <div class="item">
                <div class="header">标题2</div>
                <div class="content hide">内容</div>
            </div>
            <div class="item">
                <div class="header">标题3</div>
                <div class="content hide">内容</div>
            </div>
    
        </div>
        <script src="jquery-3.3.1.js"></script>
        <script>
            $('.header').click(function(){
            $(this).next().removeClass('hide').parent().siblings().find('.content').addClass('hide');
    
            })
        </script>
    </body>
    </html>
    
    
    
    
    第17周 07章节   模态编程框(1)
    
    
    
    parents([expr])
    parentsUntil([e|e][,f])
    children([expr])
    find(e|o|e)
    next([expr])
    nextAll([expr])
    nextUntil([e|e][,f])
    prev([expr])
    prevAll([expr])
    prevUntil([e|e][,f])
    siblings([expr])
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <table border="1">
            <tr>
                <td>1.1.1.1</td>
                <td>80</td>
                <td>
                    <a>编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.1</td>
                <td>80</td>
                <td>
                    <a>编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.1</td>
                <td>80</td>
                <td>
                    <a>编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.1</td>
                <td>80</td>
                <td>
                    <a>编辑</a>
                    <a>删除</a>
                </td>
            </tr>
        </table>
    </body>
    </html>
    
    
    
    
    
    第17周 08章节   模态编程框(2)--弹出对话框  下一节完善
    
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
            .model{
                position: fixed;
                top:50%;
                left: 50%;
                 500px;
                height: 500px;
                margin-left: -250px;
                margin-top: -250px;
                background: silver;
                z-index: 10;
            }
            .shadow{
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                opacity: 0.6;
                background: black;
                z-index: 9;
            }
        </style>
    </head>
    <body>
        <a onclick="addEliment()">添加</a>
        <table border="1">
            <tr>
                <td>1.1.1.1</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.2</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.3</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.4</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
        </table>
        <dev>
            <div class="model hide">
                <input name="hostname" type="text">
                <input name="port" type="text">
    
                <div >
                    <input type="button" value="取消" onclick="cancelModl()">
                </div>
            </div>
            <div class="shadow hide"></div>
        </dev>
        <script src="jquery-3.3.1.js"></script>
        <script>
            function addEliment(){
                $('.model,.shadow').removeClass('hide');
            }
            function cancelModl(){
                $('.model,.shadow').addClass('hide');
            }
            $('edit').click(function(){
    
            });
        </script>
    </body>
    </html>
    
    
    
    
    
    
    第17周 09章节  jquery样式及属性操作   --弹出对话框并且赋值
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="i1">hhhhh<a>oooooo</a>uuuuu</div>
        <script src="jquery-3.3.1.js"></script>
    </body>
    </html>
    
    
    
    $('#i1').html("<p>kkkkk</p>")   解析标签
    
    $('#i1').text("<p>llllll</p>")  不解析标签
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="i1">hhhhh<a>oooooo</a>uuuuu</div>
    
        <input id="i2" type="text">
    
        <script src="jquery-3.3.1.js"></script>
    </body>
    </html>
    
     
    $('#i2').val()
    
    $('#i2').val('999')
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
            .model{
                position: fixed;
                top:50%;
                left: 50%;
                 500px;
                height: 500px;
                margin-left: -250px;
                margin-top: -250px;
                background: silver;
                z-index: 10;
            }
            .shadow{
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                opacity: 0.6;
                background: black;
                z-index: 9;
            }
        </style>
    </head>
    <body>
        <a onclick="addEliment()">添加</a>
        <table border="1">
            <tr>
                <td>1.1.1.1</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.2</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.3</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td>1.1.1.4</td>
                <td>80</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
        </table>
        <dev>
            <div class="model hide">
                <input name="hostname" type="text">
                <input name="port" type="text">
    
                <div >
                    <input type="button" value="取消" onclick="cancelModl()">
                </div>
            </div>
            <div class="shadow hide"></div>
        </dev>
        <script src="jquery-3.3.1.js"></script>
        <script>
            function addEliment(){
                $('.model,.shadow').removeClass('hide');
            }
            function cancelModl(){
                $('.model,.shadow').addClass('hide');
                $('.model input[type=text]').val("");
            }
            $('.adit').click(function(){
                $('.model,.shadow').removeClass('hide');
                var tds=$(this).parent().prevAll();
                //this:获取内容
                var port=$(tds[0]).text();
                var host=$(tds[1]).text();
                $('.model input[name="hostname"]').val(host);
                $('.model input[name=port]').val(port);
            });
        </script>
    </body>
    </html>
    
    
    
    
    
    第17周 10章节   模态编程  开关  
    
    
    
    属性操作:
    	$('#i1').attr('type')   
    	$('#i1').removeAttr('name')
    	$()prop
    	$('#i2').prop('checked',true);
    	
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
        </style>
    </head>
    <body>
        <input id="i1" type="button" value="开关">
        <div class="c1 hide">hhhhhhhhhh</div>
        <script src="jquery-3.3.1.js"></script>
        <script>
            $('#i1').click(function(){
                $('.c1').toggleClass('hide');
            })
        </script>
    </body>
    </html>
    
    
    
    
    
    $('#i1').attr('type')
    "button"
    
    $('#i1').attr('name','bob')
    
    
    $('#i1')[0]
    <input id="i1" type="button" value="开关">
    
    
    $('#i1').removeAttr('name')
    
    
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
        </style>
    </head>
    <body>
        <input type="checkbox" id="i2"/>
        <input id="i1" type="button" value="开关"/>
        <div class="c1 hide">hhhhhhhhhh</div>
        <script src="jquery-3.3.1.js"></script>
        <script>
            $('#i1').click(function(){
                $('.c1').toggleClass('hide');
            })
        </script>
    </body>
    </html>
    
    
    $('#i2').prop('checked',true);
    jQuery.fn.init?[input#i2]
    
    
    $('#i2').prop('checked',false);
    jQuery.fn.init?[input#i2]
    
    
    
    
    
    第17周 11章节   tab菜单切换    添加ip  在中间添加一行
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
            .model{
                position: fixed;
                top:50%;
                left: 50%;
                 500px;
                height: 500px;
                margin-left: -250px;
                margin-top: -250px;
                background: silver;
                z-index: 10;
            }
            .shadow{
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                opacity: 0.6;
                background: black;
                z-index: 9;
            }
        </style>
    </head>
    <body>
        <a onclick="addEliment()">添加</a>
        <table border="1">
            <tr>
                <td target="hostname">1.1.1.1</td>
                <td target="port">80</td>
                <td target="网段">1.1.1.0</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td target="hostname">1.1.1.2</td>
                <td target="port">80</td>
                <td target="网段">1.1.1.0</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td target="hostname">1.1.1.3</td>
                <td target="port">80</td>
                <td target="网段">1.1.1.0</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
            <tr>
                <td target="hostname">1.1.1.4</td>
                <td target="port">80</td>
                <td target="网段">1.1.1.0</td>
                <td>
                    <a class="adit">编辑</a>
                    <a>删除</a>
                </td>
            </tr>
        </table>
        <dev>
            <div class="model hide">
                <input name="hostname" type="text">
                <input name="port" type="text">
                <input name="网段" type="text">
    
                <div >
                    <input type="button" value="取消" onclick="cancelModl()">
                </div>
            </div>
            <div class="shadow hide"></div>
        </dev>
        <script src="jquery-3.3.1.js"></script>
        <script>
            function addEliment(){
                $('.model,.shadow').removeClass('hide');
            }
            function cancelModl(){
                $('.model,.shadow').addClass('hide');
                $('.model input[type=text]').val("");
            }
            $('.adit').click(function(){
                $('.model,.shadow').removeClass('hide');
                var tds=$(this).parent().prevAll();
                tds.each(function(){
                    var n=$(this).attr('target');
                    var text=$(this).text();
                    var a1='.model input[name="';
                    var a2='"]';
                    var temp=a1+n+a2;
                    $(temp).val(text);
                });
                //this:获取内容
    //            var port=$(tds[0]).text();
    //            var host=$(tds[1]).text();
    //            $('.model input[name="hostname"]').val(host);
    //            $('.model input[name=port]').val(port);
            });
        </script>
    </body>
    </html>
    
    
    
    
    
    
    第17周 12章节  jquery内容操作   没写全
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide{
                display: none;
            }
            .menue{
                height: 38px;
                background-color: antiquewhite;
            }
            .menue .menue-item{
                float: left;
                border-right: 1px solid red;
                line-height: 38px;
                padding: 0 5px;
                cursor: pointer;
            }
            .content{
                min-height: 50px;
                border: 1px solid gainsboro;
            }
            .active{
                background-color: aqua;
            }
        </style>
    </head>
    <body>
        <div style=" 700px;margin: 0 auto">
            <div class="menue">
                <div class="menue-item active" a="1">菜单1</div>
                <div class="menue-item" a="2">菜单2</div>
                <div class="menue-item">菜单3</div>
            </div>
            <div class="content">
                <div b="1">内容1</div>
                <div class="hide" b="2">内容2</div>
                <div class="hide" b="3">内容3</div>
            </div>
    
        </div>
    <script src="jquery-3.3.1.js"></script>
        <script>
            $('.menue-item').click(function(){
                $(this).addClass('active').siblings().removeClass('active');
                var target=$(this).attr('a');
            })
        </script>
    </body>
    </html>
    
    
    
    
    
    
    
    
    
    
    第18周 07章节  Django web框架
    
    
    
    第18周 08章节  Django工程创建
    
    
    1、安装django
    
    创建:django-admin ststtproject +文件名
    访问:python manage.py runserver 127.0.0.1:8001
    
    
    
    新建ceshi.py
    
    from django.shortcuts import HttpResponse
    
    def index(request):
        return HttpResponse("ok")
    
    
    
    
    urls.py:
    
    """ceshi URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    
    from ceshi3 import s1
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', s1.index),
    ]
    
    
    
    
    访问:http://127.0.0.1:8001/hhhhh/
    
    
    
    
    
    
    
    第18周 09章节 django目录
    
    
    
    urls.py:
    
    """ceshi URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from django.shortcuts import HttpResponse
    
    def home(request):
        return HttpResponse('<h1>hello</h1>')
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index.html', home),
    ]
    
    
    
    
    
    第18周 10章   django创建App
    
    
    
    
    第18周 11章 django app里面的各个组件介绍
    
    
    第18周 12章  django 实现用户登录
    
    
    view.py
    
    
    from django.shortcuts import render
    
    # Create your views here.
    from django.shortcuts import HttpResponse
    
    def login(request):
        f=open('template/login.html','r',encoding='utf-8')
        data=f.read()
        f.close()
        return HttpResponse(data)
    
    
    
    
    urls.py
    
    
    """ceshi URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from cmdb import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login', views.login),
    ]
    
    
    
    
    login.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            label{
                 80px;
                text-align: right;
            }
        </style>
    </head>
    <body>
    <form action="/login/" method="post">
        <p>
            <label for="uesrname">用户名</label>
            <input id="uesrname" type="text">
        </p>
        <p>
            <label for="uesrname">密码</label>
            <input id="uesrname" type="text">
            <input type="submit" value="提交">
        </p>
    </form>
    </body>
    </html>
    
    
    
    
    正确访问:http://127.0.0.1:8008/login   错误访问:http://127.0.0.1:8008/login/
    
    
    
    
    
    
    
    第18周 13章  django 实现用户登录2  配置static文件
    
    
    
    1、新建static目录
    
    2、static目录里面放入css、js 文件
    
    3、去settings 文件里设置 :  DIRS': [os.path.join(BASE_DIR,'templates')],   这里要写模板位置
    
    
    
    
    
    
    commons.css
    
    body{
        background-color: antiquewhite;
    }
    
    
    
    
    
    views.py
    
    from django.shortcuts import render
    
    
    def login(request):
    
        return render(request,'login.html')
    
    
    
    
    
    
    
    settings.py
    
    """
    Django settings for ceshi project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '+0_2hjpsfembktg6zi&q$y+1ma^b7o*mlxyv!b-c0(q#*1xw1m'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'ceshi.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR,'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'ceshi.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    login.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/commons.css">
        <style>
            label{
                 80px;
                text-align: right;
            }
        </style>
    </head>
    <body>
    <form action="/login/" method="post">
        <p>
            <label for="uesrname">用户名</label>
            <input id="uesrname" type="text">
        </p>
        <p>
            <label for="uesrname">密码</label>
            <input id="uesrname" type="text">
            <input type="submit" value="提交">
        </p>
    </form>
    </body>
    </html>
    
    
    
    
    urls.py
    
    """ceshi URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from cmdb import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login', views.login),
    ]
    
    
    
    
    
    第18周 14章  django实现用户登录与前端交互
    
    
    
    urls.py
    
    
    """ceshi URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from cmdb import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
    ]
    
    
    
    
    
    
    login.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/commons.css">
        <style>
            label{
                 80px;
                text-align: right;
            }
        </style>
    </head>
    <body>
    <form action="/login/" method="post">
        <p>
            <label for="uesrname" >用户名</label>
            <input id="uesrname" name="user" type="text">
        </p>
        <p>
            <label for="uesrname">密码</label>
            <input id="uesrname" name="pwd" type="password">
            <input type="submit" value="提交">
            <span style="color: red;">{{ error_msg }}</span>
    
        </p>
    </form>
        <script src="jquery-3.2.1.js"></script>
    </body>
    </html>
    
    
    
    
    
    settings.py
    
    
    """
    Django settings for ceshi project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '+0_2hjpsfembktg6zi&q$y+1ma^b7o*mlxyv!b-c0(q#*1xw1m'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'ceshi.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR,'template')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'ceshi.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    
    commons.css
    
    
    
    body{
        background-color: antiquewhite;
    }
    
    
    
    
    
    views.py
    
    
    
    
    from django.shortcuts import render
    from django.shortcuts import redirect
    
    
    def login(request):
        error_msg=""
        if request.method == "POST":
            user=request.POST.get('user',None)
            pwd=request.POST.get('pwd',None)
            if user == 'root' and pwd == "123":
                return redirect('http://www.baidu.com/')
            else:
                error_msg="用户名密码错误"
        return render(request,'login.html',{'error_msg':error_msg})
    
    
    
    
    
    
    
    第18周第15章节 用户和前端交互2
    
    
    
    1、添加表单
    
    
    urls.py
    
    
    
    """ceshi URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from cmdb import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        path('home/', views.home),
    ]
    
    
    
    
    login.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="/static/commons.css">
        <style>
            label{
                 80px;
                text-align: right;
            }
        </style>
    </head>
    <body>
    <form action="/login/" method="post">
        <p>
            <label for="uesrname" >用户名</label>
            <input id="uesrname" name="user" type="text">
        </p>
        <p>
            <label for="uesrname">密码</label>
            <input id="uesrname" name="pwd" type="password">
            <input type="submit" value="提交">
            <span style="color: red;">{{ error_msg }}</span>
    
        </p>
    </form>
        <script src="jquery-3.2.1.js"></script>
    </body>
    </html>
    
    
    
    
    home.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body style="margin: 0">
        <div style="height: 48px;background-color: aqua"></div>
        <div>
        <form action="/home/" method="post">
            <input type="text" name="username" placeholder="用户名">
            <input type="text" name="email" placeholder="邮箱">
            <input type="text" name="gender" placeholder="性别">
            <input type="submit" value="添加">
    
        </form>
            <table>
                {% for row in user_list %}
                <tr>
                    <td>{{ row.username }}</td>
                    <td>{{ row.gender }}</td>
                    <td>{{ row.email }}</td>
                </tr>
                {% endfor %}
            </table>
        </div>
    </body>
    </html>
    
    
    
    
    settings.py
    
    
    
    """
    Django settings for ceshi project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '+0_2hjpsfembktg6zi&q$y+1ma^b7o*mlxyv!b-c0(q#*1xw1m'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'ceshi.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR,'template')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'ceshi.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    views.py
    
    
    
    from django.shortcuts import render
    from django.shortcuts import redirect
    
    
    def login(request):
        error_msg=""
        if request.method == "POST":
            user=request.POST.get('user',None)
            pwd=request.POST.get('pwd',None)
            if user == 'root' and pwd == "123":
                return redirect('/home')
            else:
                error_msg="用户名密码错误"
        return render(request,'login.html',{'error_msg':error_msg})
    
    USER_LIST=[{'username':'jack','email':'145.com','gender':'男'}]
    for index in range(20):
        temp={'username':'jack'+str(index),'email':'145.com','gender':'男'}
        USER_LIST.append(temp)
    def home(request):
        if request.method=='POST':
            u=request.POST.get('username')
            e=request.POST.get('email')
            g=request.POST.get('gender')
            temp={'username':u+str(index),'email':e,'gender':g}
            USER_LIST.append(temp)
        return render(request,'home.html',{'user_list':USER_LIST})
    
    
    
    
    
    
    第18周 16章 django  路由简介
    
    
    第18周 17章  知识总结
    
    
    
    
    第19章  第三章  django工程创建
    
    
    
    1、先用pychcarm 创建一个工程:19章
    
    
    2、创建 app
    
    在pycharm 的终端输入:
    
    on manage.py startapp app01    
    
    
    3、创建static文件:
    
    在总的工程下创建
    
    
    
    4、修改19章 里面 setting文件  
    
       注释掉 csrf 那一行
       
       查看是否添加模板路径:'DIRS': [os.path.join(BASE_DIR, 'templates')] 
       
       添加 静态文件路径;
    
    	STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR, 'static'),      ------注意:一定要加逗号,否则报错
    )
    
    
    注册app01:
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    ]
    
    
    
    
    
    5、在总的工程下创建 templates文件
    
    
    
    
    第19章  第4章 打开多个数据和上传文件
    
    
    打开多个数据:
    request.POST.getlist()
    
    
    上传文件:
    obj=request.FILES.get('send')
            print(obj,type(obj),obj.name)
            import os
            file_path=os.path.join('upload',obj.name)
            f=open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
    
    
    
    
    settings.py
    
    
    """
    Django settings for 第19章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'z7w5!-=vwuu$#$6i2yr05unkjvn*td@#qxc#0=-^d_ra4b-e+)'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第19章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第19章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIR=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    urls.py
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index),
        path('login/', views.login),
    ]
    
    
    
    
    
    views.py
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    # Create your views here.
    def index(request):
        return HttpResponse('ok')
    
    def login(request):
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
    
            obj=request.FILES.get('send')
            print(obj,type(obj),obj.name)
            import os
            file_path=os.path.join('upload',obj.name)
            f=open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
            from django.core.files.uploadedfile import InMemoryUploadedFile
            return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    
    
    
    
    login.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body >
        <form action="/login/" method="POST" enctype="multipart/form-data">
            <p>
                <input type="text" name="user" placeholder="用户名">
            </p>
            <p>
                <input type="password" name="pwd" placeholder="密码">
            </p>
            <p>
                男:<input type="radio" name="gender" value="1"/>
                女:<input type="radio" name="gender" value="2"/>
                小李:<input type="radio" name="gender" value="3"/>
    
            </p>
            <p>
                男:<input type="checkbox" name="favor" value="11"/>
                女:<input type="checkbox" name="favor" value="22"/>
                小李:<input type="checkbox" name="favor" value="33"/>
    
            </p>
            <p>
                <select name="city" multiple>
                    <option value="sh">上海</option>
                    <option value="bj">北京</option>
                    <option value="tj">天津</option>
                </select>
            </p>
            <p>
                <input type="file" name="send">
            </p>
            <p>
                <input type="submit" value="提交">
            </p>
        </form>
    </body>
    </html>
    
    
    
    
    
    第19章 05节 django 的CBV 和 FBV
    
    
    FBV
    
    function base view   就是view里面写的函数
    
    
    
    CBV
    
    类 base view        就是view里面写的类
    
    
    
    
    
    
    CBV 代码
    
    
    
    
    settings
    
    
    """
    Django settings for 第19章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'z7w5!-=vwuu$#$6i2yr05unkjvn*td@#qxc#0=-^d_ra4b-e+)'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第19章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第19章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIR=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    
    urls
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('index/', views.index),
        path('login/', views.login),
        path('home/', views.Home.as_view()),
    ]
    
    
    
    
    
    views.py
    
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    # Create your views here.
    def index(request):
        return HttpResponse('ok')
    
    def login(request):
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
    
            obj=request.FILES.get('send')
            print(obj,type(obj),obj.name)
            import os
            file_path=os.path.join('upload',obj.name)
            f=open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
            from django.core.files.uploadedfile import InMemoryUploadedFile
            return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    from django.views import View
    class Home(View):
        def dispatch(self, request, *args, **kwargs):
            print('before')#可以定制写功能
            result=super(Home,self).dispatch(request, *args, **kwargs)#相当于分发器
            print('after')#可以定制写功能
            return result
    
        def get(self,request):
            print(request.method)
            return render(request,'home.html')
        def post(self,request):
            print(request.method)
            return render(request,'home.html')
    
    
    
    
    
    home.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/home/" method="POST">
        <input type="text" name="user">
        <input type="submit">
        </form>
    </body>
    </html>
    
    
    
    
    
    第19周 06章 django 模板语音循环字典
    
    
    
    
    settings.py
    
    
    """
    Django settings for 第19章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'z7w5!-=vwuu$#$6i2yr05unkjvn*td@#qxc#0=-^d_ra4b-e+)'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第19章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第19章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIR=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    
    views.py
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    # Create your views here.
    
    USER_DICT={
        'k1':'root1',
        'k2':'root2',
        'k3':'root3',
        'k4':'root4',
    }
    
    def index(request):
        return render(request,'index.html',{'user_dict':USER_DICT})
    
    
    
    
    def login(request):
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
    
            obj=request.FILES.get('send')
            print(obj,type(obj),obj.name)
            import os
            file_path=os.path.join('upload',obj.name)
            f=open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
            from django.core.files.uploadedfile import InMemoryUploadedFile
            return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    
    # from django.views import View
    #
    # class Home(View):
    #     def dispatch(self, request, *args, **kwargs):
    #         print('before')#kkkk
    #         result=super(Home,self).dispatch(request, *args, **kwargs)
    #         print('after')
    #         return result
    #
    #     def get(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    #     def post(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    
    
    
    
    
    
    urls.py
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        #path('home/', views.Home.as_view()),
        path('index/', views.index),
    ]
    
    
    
    
    
    
    index.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {{ user_dict.k1 }}
        <ul>
            {% for key,row in user_dict.items %}
            <li>{{ key }}-{{ row }}</li>
            {% endfor %}
        </ul>
    </body>
    </html>
    
    
    
    
    访问
    
    http://127.0.0.1:8000/index/
    
    
    
    
    
    
    
    第19章 django 07  正则表达示 url   id发生变化  url跟着发生变化
    
    
    
    
    settings.py
    
    
    """
    Django settings for 第19章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'z7w5!-=vwuu$#$6i2yr05unkjvn*td@#qxc#0=-^d_ra4b-e+)'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第19章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第19章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIR=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    views.py
    
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    # Create your views here.
    
    # USER_DICT={
    #     'k1':'root1',
    #     'k2':'root2',
    #     'k3':'root3',
    #     'k4':'root4',
    # }
    USER_DICT={
        '1':{'name':'root1','email':'root@123.com'},
        '2':{'name':'root2','email':'root@123.com'},
        '3':{'name':'root3','email':'root@123.com'},
        '4':{'name':'root4','email':'root@123.com'}
    }
    
    def index(request):
        return render(request,'index.html',{'user_dict':USER_DICT})
    
    def detail(request):
        nid=request.GET.get('nid')
        detail_info=USER_DICT[nid]
        return render(request,'detail.html',{'detail_info':detail_info})
    
    
    
    def login(request):
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
    
            obj=request.FILES.get('send')
            print(obj,type(obj),obj.name)
            import os
            file_path=os.path.join('upload',obj.name)
            f=open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
            from django.core.files.uploadedfile import InMemoryUploadedFile
            return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    
    # from django.views import View
    #
    # class Home(View):
    #     def dispatch(self, request, *args, **kwargs):
    #         print('before')#kkkk
    #         result=super(Home,self).dispatch(request, *args, **kwargs)
    #         print('after')
    #         return result
    #
    #     def get(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    #     def post(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    
    
    
    
    urls.py
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        #path('home/', views.Home.as_view()),
        path('index/', views.index),
        path('detail/', views.detail),
    ]
    
    
    
    
    
    index.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <ul>
            {% for k,row in user_dict.items %}
            <li><a target="_blank" href="/detail/?nid={{ k }}">{{ row.name }}</a></li>
            {% endfor %}
        </ul>
    </body>
    </html>
    
    
    
    
    
    detail.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>详细信息</h1>
        <h6>用户名:{{ detail_info.name }}</h6>
        <h6>详细信息:{{ detail_info.email }}</h6>
    
    </body>
    </html>
    </body>
    </html>
    
    
    
    
    home.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/home/" method="POST">
        <input type="text" name="user">
        <input type="submit">
        </form>
    </body>
    </html>
    
    
    
    
    login.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body >
        <form action="/login/" method="POST" enctype="multipart/form-data">
            <p>
                <input type="text" name="user" placeholder="用户名">
            </p>
            <p>
                <input type="password" name="pwd" placeholder="密码">
            </p>
            <p>
                男:<input type="radio" name="gender" value="1"/>
                女:<input type="radio" name="gender" value="2"/>
                小李:<input type="radio" name="gender" value="3"/>
    
            </p>
            <p>
                男:<input type="checkbox" name="favor" value="11"/>
                女:<input type="checkbox" name="favor" value="22"/>
                小李:<input type="checkbox" name="favor" value="33"/>
    
            </p>
            <p>
                <select name="city" multiple>
                    <option value="sh">上海</option>
                    <option value="bj">北京</option>
                    <option value="tj">天津</option>
                </select>
            </p>
            <p>
                <input type="file" name="send">
            </p>
            <p>
                <input type="submit" value="提交">
            </p>
        </form>
    </body>
    </html>
    
    
    
    
    静态方式:常用方式
    
    
    
    settings.py
    
    
    """
    Django settings for 第19章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'z7w5!-=vwuu$#$6i2yr05unkjvn*td@#qxc#0=-^d_ra4b-e+)'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG =  True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第19章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第19章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIR=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    views.py
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    import urllib
    # Create your views here.
    
    # USER_DICT={
    #     'k1':'root1',
    #     'k2':'root2',
    #     'k3':'root3',
    #     'k4':'root4',
    # }
    USER_DICT={
        '1':{'name':'root1','email':'root@123.com'},
        '2':{'name':'root2','email':'root@123.com'},
        '3':{'name':'root3','email':'root@123.com'},
        '4':{'name':'root4','email':'root@123.com'}
    }
    
    def index(request):
        return render(request,'index.html',{'user_dict':USER_DICT})
    
    def detail(request,nid):
        detail_info=USER_DICT[nid]
        return render(request,'detail.html',{ 'detail_info':detail_info})
    
    
    
    
    
    def login(request):
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
    
            obj=request.FILES.get('send')
            print(obj,type(obj),obj.name)
            import os
            file_path=os.path.join('upload',obj.name)
            f=open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
            from django.core.files.uploadedfile import InMemoryUploadedFile
            return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    
    # from django.views import View
    #
    # class Home(View):
    #     def dispatch(self, request, *args, **kwargs):
    #         print('before')#kkkk
    #         result=super(Home,self).dispatch(request, *args, **kwargs)
    #         print('after')
    #         return result
    #
    #     def get(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    #     def post(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    
    
    
    
    detail.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>详细信息</h1>
        <h6>用户名:{{ detail_info.name }}</h6>
        <h6>详细信息:{{ detail_info.email }}</h6>
    
    </body>
    </html>
    </body>
    </html>
    
    
    
    
    
    urls.py
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    import urllib
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        #path('home/', views.Home.as_view()),
        path('index/', views.index),
        url('detail-(d+).html', views.detail),
    ]
    
    
    
    
    
    index.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
        <ul>
            {% for k,row in user_dict.items %}
            <li><a target="_blank" href="/detail-{{ k }}.html"> {{ row.name }} </a></li>
            {% endfor %}
        </ul>
    </body>
    </html>
    
    
    
    
    
    19周 08章  DJango基于正则表达式 url2
    
    
    
    
    路由系统:
    
    
    1、path('login/', views.login),   path('home/', views.Home.as_view()),
    
    
    2、url('detail-(d+).html', views.detail),
    
    
    3、url('detail-(?P<nid>d+)-(?P<nid>d+).html', views.detail),
    
    
    
    
    
    
    19周 09章  url的  name
    
    
    
    对utl路由关系进行命令,以后可以根据这个名称来定制想要的url
    
    
    
    path('indexhhh/', views.index,name='indexx')
    
    url('indexhhh/(d+)', views.index,name='indexx'),
    
    
    
    模板语言:
    
    
    {% url indexx %}
    
    {% url indexx 3 %}
    
    
    当前的url:
    
    action="{{ request.path_info }}   
    
    
    
    
    生成自己想要的url
    
    
    url('indexhhh/(d+)/(d+)', views.index,name='indexx'),
    v=reverse('indexx',args=(90,80))
    
    
    
    url('indexhhh/(?P<nid>d+)/(?P<uid>d+)', views.index,name='indexx'),
    v=reverse('indexx',kwargs={"nid":"1", "uid":"99"})
    <form action="{% url 'indexx' nid=1 uid=3 %}" method="POST">
    
    
    
    
    
    settings.py
    
    
    """
    Django settings for 第19章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'z7w5!-=vwuu$#$6i2yr05unkjvn*td@#qxc#0=-^d_ra4b-e+)'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG =  True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第19章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第19章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIR=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    views.py
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    import urllib
    # Create your views here.
    
    # USER_DICT={
    #     'k1':'root1',
    #     'k2':'root2',
    #     'k3':'root3',
    #     'k4':'root4',
    # }
    USER_DICT={
        '1':{'name':'root1','email':'root@123.com'},
        '2':{'name':'root2','email':'root@123.com'},
        '3':{'name':'root3','email':'root@123.com'},
        '4':{'name':'root4','email':'root@123.com'}
    }
    
    def index(request,nid,uid):
        print(request.path_info)
        from django.urls import reverse
        #v=reverse('indexx',args=(90,80))
        v=reverse('indexx',kwargs={"nid":"1", "uid":"99"})
        print(v)
        return render(request,'index.html',{'user_dict':USER_DICT})
    
    def detail(request,nid):
    
        detail_info=USER_DICT[nid]
        return render(request,'detail.html',{ 'detail_info':detail_info})
    
    
    def login(request):
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
    
            obj=request.FILES.get('send')
            print(obj,type(obj),obj.name)
            import os
            file_path=os.path.join('upload',obj.name)
            f=open(file_path,mode="wb")
            for i in obj.chunks():
                f.write(i)
            f.close()
            from django.core.files.uploadedfile import InMemoryUploadedFile
            return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    
    # from django.views import View
    #
    # class Home(View):
    #     def dispatch(self, request, *args, **kwargs):
    #         print('before')#kkkk
    #         result=super(Home,self).dispatch(request, *args, **kwargs)
    #         print('after')
    #         return result
    #
    #     def get(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    #     def post(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    
    
    
    
    detail.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>详细信息</h1>
        <h6>用户名:{{ detail_info.name }}</h6>
        <h6>详细信息:{{ detail_info.email }}</h6>
    
    </body>
    </html>
    </body>
    </html>
    
    
    
    
    urls.py
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    import urllib
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        #path('home/', views.Home.as_view()),
        #url('indexhhh/(d+)/(d+)', views.index,name='indexx'),
        url('indexhhh/(?P<nid>d+)/(?P<uid>d+)', views.index,name='indexx'),
        #path('indexhhh/', views.index,name='indexx'),
        #url('detail-(d+).html', views.detail),
        url('detail-(?P<nid>d+).html', views.detail),
    ]
    
    
    
    
    
    
    index.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="{% url 'indexx' nid=1 uid=3 %}" method="POST">
            <p><input type="text" name="user" placeholder="用户名"></p>
            <p><input type="text" name="user" placeholder="用户名"></p>
            <input type="submit" value="提交">
    
        </form>
    
        <ul>
            {% for k,row in user_dict.items %}
            <li><a target="_blank" href="/detail-{{ k }}.html"> {{ row.name }} </a></li>
            {% endfor %}
        </ul>
    </body>
    </html>
    
    
    
    
    访问:
    http://127.0.0.1:8000/indexhhh/1/9/
    
    
    
    19周 10章 django 路由分发
    
    
    
    总的urls:
    
    
    from django.conf.urls import url,include
    import urllib
    
    
    urlpatterns = [
        url(r'^cmdb/',include("app01.urls")),
        url(r'^monitor/',include("app02.urls")),
        ]
    
    
    
    
    cmdb里面的urls:
    
    
    
    from django.urls import path
    from app01 import views
    urlpatterns = [
    
        path('login/', views.login),
    
        ]
    
    
    
    
    monitor里面的urls:
    
    
    from django.urls import path
    from app02 import views
    
    urlpatterns = [
    
        path('login/', views.login),
    
        ]
    
    
    
    
    
    
    19周 11章  django ORM基本创建类型以及生成数据库结构
    
    类型:
    
    dbfirst  :通过数据库创建类
    
    codefirst:先创建类 再创建数据库 --最常用
    
    ORM的意思: 通过类创建数据库
    
    
    
    创建类
    
    1、根据类自动创建书记库表
       配置 app下的model.py
    
    2、根据类对数据库表中的数据进行各种操作
    
    class UserInfo(models.Model):
        #自动创建 id列  自增主键
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=64)
    
    执行命令:
    
    python manage.py makemigrations
    python manage.py migrate
    
    
    
    默认链接 sqlite  如果要链接myaql 需要进行配置:
    
    前提:需要创建mysql表
    
    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'dbname',
        'USER': 'root',
        'PASSWORD': 'xxx',
        'HOST': '',
        'PORT': '',
        }
    }
    
    
    
    
    
    
    
    models.py
    
    
    from django.db import models
    
    # Create your models here.
    class UserInfo(models.Model):
        #自动创建 id列  自增主键
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=64)
    
    
    
    
    
    19周 12章  django ORM使用mysql 注意:
    
    
    需要先修改pymysql:在project同名文件夹的__init__文件中添加如下代码:
    
    
    import pymysql
    pymysql.install_as_MySql()
    
    
    
    
    
    
    
    19周 13章   django ORM  基本操作 增、删、改、查
    
    
    1、先导入模块
    
    from app01 import models
    
        创建
        models.UserInfo.objects.create(username='root',password='123',)
        obj=models.UserInfo(username='bob',password='456')
        obj.save()
        dic={'username':'jack','password':'789'}
        models.UserInfo.objects.create(dic)
        查
        result=models.UserInfo.objects.all()
        result=models.UserInfo.objects.filter(username='root',password=999)
    
    
        拿到的是一个对象,而且是名字、密码都一样的第一个
        obj=models.UserInfo.objects.filter(username=u,password=p).first()
        
        取对象中的某一个数据
        obj=models.UserInfo.objects.filter(id=3).first()
        print(obj.username)
        
    
        拿到的是一个列表,而且是名字、密码都一样的多个
        obj=models.UserInfo.objects.filter(username=u,password=p)
    
        循环拿列表中的某一个数据:
    def orm(request):
    
    obj=models.UserInfo.objects.filter(id=3)
        for i in obj:
            print(i.username)
    
        return HttpResponse('orm')
        
    
        删除:
        models.UserInfo.objects.filter().delete()
        更新
        models.UserInfo.objects.all().update(password=888)
        models.UserInfo.objects.filter(id=1).update(password=999
    
    
    
    
    
    
    
    第19章urls.py
    
    
    urlpatterns = [
        url(r'^cmdb/',include("app01.urls")),
        url(r'^monitor/',include("app02.urls")),
        ]
    
    
    
    
    app01views.py
    
    from app01 import models
    def orm(request):
        创建
        models.UserInfo.objects.create(username='root',password='123',)
        obj=models.UserInfo(username='bob',password='456')
        obj.save()
        dic={'username':'jack','password':'789'}
        models.UserInfo.objects.create(dic)
        查
        result=models.UserInfo.objects.all()
        result=models.UserInfo.objects.filter(username='root',password=999)
        
        删除:
        models.UserInfo.objects.filter().delete()
        更新
        models.UserInfo.objects.all().update(password=888)
        models.UserInfo.objects.filter(id=1).update(password=999
    
    
    
    
    
    第19章 14节 基于ORM实现用户登录:
    
    
    
    报错问题:
    
    1、访问页面没有内容,返回200错误,说明肯定是html里面的内容写错了
    
    
    2、ValueError: not enough values to unpack (expected 2, got 1)     
        
       这个错误说明:obj=models.UserInfo.objects.filter(id=nid).first()  这个里面没有写“id=” 
       
       或者:{'obj':obj}  这个写错了  
    
       总之是括号里面的少个东西
    
    
    3、url一定要写成这样格式,否则很容易报错
    
       url(r'^userdetail-(?P<nid>d+)/', views.user_detail,),
    
    
    
    
    
    过程:
    
    
    
    app01/urls.py
    
    
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    urlpatterns = [
    
        path('login/', views.login),
        path('index/', views.index,),
        path('user_info/', views.user_info,),
        url(r'^userdetail-(?P<nid>d+)/', views.user_detail,),
        path('orm/', views.orm),
    
        ]
    
    
    
    
    
    app01/views.py
    
    
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    import urllib
    # Create your views here.
    
    # USER_DICT={
    #     'k1':'root1',
    #     'k2':'root2',
    #     'k3':'root3',
    #     'k4':'root4',
    # }
    USER_DICT={
        '1':{'name':'root1','email':'root@123.com'},
        '2':{'name':'root2','email':'root@123.com'},
        '3':{'name':'root3','email':'root@123.com'},
        '4':{'name':'root4','email':'root@123.com'}
    }
    
    def index(request):
        return render(request,'index.html')
    def user_info(request):
        user_list=models.UserInfo.objects.all()
        #print(user_list.query)
        return render(request,'user_info.html',{'user_list':user_list})
    def user_detail(request,nid):
        obj=models.UserInfo.objects.filter(id=nid).first()
    
        return render(request,'user_detail.html',{'obj':obj})
    
    
    
    def login(request):
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
            #数据库中执行 select 判断用户名和密码是否中确
            u=request.POST.get('user')
            p=request.POST.get('pwd')
            #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
            obj=models.UserInfo.objects.filter(username=u, password=p).first()
            #print(obj)
            #下面意思:如果obj为真
            if obj:
                return redirect('/cmdb/index/')
            else:
                return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    from app01 import models
    def orm(request):
        #创建
        #models.UserInfo.objects.create(username='root',password='123',)
        # obj=models.UserInfo(username='bob',password='456')
        # obj.save()
        # dic={'username':'jack','password':'789'}
        # models.UserInfo.objects.create(dic)
        #查
        result=models.UserInfo.objects.all()
        #result=models.UserInfo.objects.filter(username='root',password=999)
        #
        #删除:
        #models.UserInfo.objects.filter().delete()
        #更新
        #models.UserInfo.objects.all().update(password=888)
        # obj=models.UserInfo.objects.filter(id=3)
        # for i in obj:
        #     print(i.username)
        #
        return HttpResponse('orm')
    
    # from django.views import View
    #
    # class Home(View):
    #     def dispatch(self, request, *args, **kwargs):
    #         print('before')#kkkk
    #         result=super(Home,self).dispatch(request, *args, **kwargs)
    #         print('after')
    #         return result
    #
    #     def get(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    #     def post(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    
    
    
    
    
    templates/login.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body >
        <form action="/cmdb/login/" method="POST" enctype="multipart/form-data">
            <p>
                <input type="text" name="user" placeholder="用户名">
            </p>
            <p>
                <input type="password" name="pwd" placeholder="密码">
            </p>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    
    
    
    
    
    templates/index.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .menu{
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px;background-color: black;color: white">
        欢迎到来
        </div>
        <div>
            <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
                <a class="menu" href="/cmdb/user_info/">用户管理</a>
                <a class="menu" href="/cmdb/user_group/">用户组管理</a>
            </div>
        </div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 0;overflow: auto">
    
        </div>
    </body>
    </html>
    
    
    
    
    
    templates/user_info.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .menu{
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px;background-color: black;color: white">
        欢迎到来
        </div>
        <div>
            <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
                <a class="menu" href="/cmdb/user_info/">用户管理</a>
                <a class="menu" href="/cmdb/user_group/">用户组管理</a>
            </div>
        </div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 700px;overflow: auto;background-color: antiquewhite">
            <h3>用户列表</h3>
            <ul>
                {% for row in user_list %}
                    <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a></li>
                {% endfor %}
            </ul>
        </div>
    </body>
    </html>
    
    
    
    
    
    
    templates/user_detail.html
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .menu{
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px;background-color: black;color: white">
        欢迎到来
        </div>
        <div>
            <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
                <a class="menu" href="/cmdb/user_info/">用户管理</a>
                <a class="menu" href="/cmdb/user_group/">用户组管理</a>
            </div>
        </div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 700px;overflow: auto;background-color: antiquewhite">
            <h1>用户详细信息</h1>
            <h2>{{ obj.id }}</h2>
            <h2>{{ obj.name }}</h2>
            <h2>{{ obj.password }}</h2>
        </div>
    </body>
    </html>
    
    
    
    
    
    19周-15章python基于 Django 基于ORM实现用户增加、删除、修改、查看
    
    
    
    
    models.Business.objects.all()
    
    是个对象
    
    models.Business.objects.values('id','caption')
    
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    
    models.Business.objects.values_list('id','caption')
    
    #[(1,运维),(2,市场)]  values_list 是个元组
    
    
    
    
    1、
    
    注意:method="post"  一定要写。一定是小写  否则报错
    
    <form action="/cmdb/user_info/" method="post">
    
    
    
    2、
    
    注意href和action、return redirect三个的区分,容易混淆
    
    
    这是做的跳转:
    
    <a class="menu" href="/cmdb/user_info/">用户管理</a> 
    
          
    
    这是提交的当前的页面:
    
    <form method="post" action="/cmdb/useredit-{{ obj.id }}/">
    
    
    
    这个不加html
    return redirect用法:不加html
    
    return redirect('/cmdb/index/')
    
    
    3、
    
    根据id删除用户的瞬间跳转到当前页面
    
    <a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a>
    
    def user_del(request,nid):
        models.UserInfo.objects.filter(id=nid).delete()
        return redirect('/cmdb/user_info/')
    
    
    
    4、
    
    注意不成功的话  重新打开一个页面试试
    
    
    
    5、
    
    注意:<input type="text" name="id" value="1"/>    value的意思是可以在输入框中显示出来id
    
    
    style="display: none"
    
    
    
    
    6、
    
    注意form表单里面action路径 一定要和 url里面的保持一致,否则报错,
    
    例如:
    
    href="/cmdb/userdetail-{{ row.id }}   
    url(r'^userdetail-(?P<nid>d+)/', views.user_detail,),
    
    
    
    
    
    
    
    app01/urls.py
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    urlpatterns = [
    
        path('login/', views.login),
        path('index/', views.index,),
        path('user_info/', views.user_info,),
        url(r'^userdetail-(?P<nid>d+)/', views.user_detail,),
        url(r'^userdel-(?P<nid>d+)/', views.user_del,),
        url(r'^useredit-(?P<nid>d+)/', views.user_edit,),
        path('orm/', views.orm),
    
        ]
    
    
    
    
    app01/views.py
    
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    from app01 import models
    import urllib
    # Create your views here.
    
    # USER_DICT={
    #     'k1':'root1',
    #     'k2':'root2',
    #     'k3':'root3',
    #     'k4':'root4',
    # }
    USER_DICT={
        '1':{'name':'root1','email':'root@123.com'},
        '2':{'name':'root2','email':'root@123.com'},
        '3':{'name':'root3','email':'root@123.com'},
        '4':{'name':'root4','email':'root@123.com'}
    }
    
    def index(request):
        return render(request,'index.html')
    def user_info(request):
        if request.method=="GET":
            user_list=models.UserInfo.objects.all()
            return render(request,'user_info.html',{'user_list':user_list})
        elif request.method=="POST":
            u=request.POST.get('user')
            p=request.POST.get('pwd')
            models.UserInfo.objects.create(username=u,password=p)
            user_list=models.UserInfo.objects.all()
        #print(user_list.query)
            return render(request,'user_info.html',{'user_list':user_list})
    def user_del(request,nid):
        models.UserInfo.objects.filter(id=nid).delete()
        return redirect('/cmdb/user_info/')
    def user_edit(request,nid):
        if request.method=='GET':
            obj=models.UserInfo.objects.filter(id=nid).first()
            return render(request,'user_edit.html',{'obj':obj})
        elif request.method=='POST':
            nid=request.POST.get('id')
            u=request.POST.get('username')
            p=request.POST.get('password')
            models.UserInfo.objects.filter(id=nid).update(username=u,password=p)
            return redirect('/cmdb/user_detail/')
    
    def user_detail(request,nid):
        obj=models.UserInfo.objects.filter(id=nid).first()
    
        return render(request,'user_detail.html',{'obj':obj})
    
    
    
    def login(request):
        #models.UserGroup.objects.create(caption='DBA')
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
            #数据库中执行 select 判断用户名和密码是否中确
            u=request.POST.get('user')
            p=request.POST.get('pwd')
            #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
            obj=models.UserInfo.objects.filter(username=u,password=p).first()
            #print(obj)
            #下面意思:如果obj为真
            if obj:
                return redirect('/cmdb/index/')
            else:
                return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    def orm(request):
        #创建
        #models.UserInfo.objects.create(username='root',password='123',)
        # obj=models.UserInfo(username='bob',password='456')
        # obj.save()
        # dic={'username':'jack','password':'789'}
        # models.UserInfo.objects.create(dic)
        #查
        result=models.UserInfo.objects.all()
        #result=models.UserInfo.objects.filter(username='root',password=999)
        #
        #删除:
        #models.UserInfo.objects.filter().delete()
        #更新
        #models.UserInfo.objects.all().update(password=888)
        # obj=models.UserInfo.objects.filter(id=3)
        # for i in obj:
        #     print(i.username)
        #
        return HttpResponse('orm')
    
    # from django.views import View
    #
    # class Home(View):
    #     def dispatch(self, request, *args, **kwargs):
    #         print('before')#kkkk
    #         result=super(Home,self).dispatch(request, *args, **kwargs)
    #         print('after')
    #         return result
    #
    #     def get(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    #     def post(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    
    
    
    
    
    templates/index.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .menu{
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px;background-color: black;color: white">
        欢迎到来
        </div>
        <div>
            <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
                <a class="menu" href="/cmdb/user_info/">用户管理</a>
                <a class="menu" href="/cmdb/user_group/">用户组管理</a>
            </div>
        </div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 0;overflow: auto">
    
        </div>
    </body>
    </html>
    
    
    
    
    
    
    templates/login.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body >
        <form action="/cmdb/login/" method="POST" enctype="multipart/form-data">
            <p>
                <input type="text" name="user" placeholder="用户名">
            </p>
            <p>
                <input type="password" name="pwd" placeholder="密码">
            </p>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    
    
    
    
    
    
    templates/user_info.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body {
                margin: 0;
            }
    
            .menu {
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
    <div style="height: 48px;background-color: black;color: white">
        欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 700px;overflow: auto;background-color: antiquewhite">
        <h3>添加用户</h3>
        <form action="/cmdb/user_info/" method="post">
            <input type="text" name="user"/>
            <input type="text" name="pwd"/>
            <input type="submit" value="添加"/>
        </form>
        <h3>用户列表</h3>
        <ul>
            {% for row in user_list %}
                <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }} </a> |
                <a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a> |
                <a href="/cmdb/useredit-{{ row.id }}/"> 编辑 </a>
                </li>
            {% endfor %}
        </ul>
    </div>
    </body>
    </html>
    
    
    
    
    
    
    templates/user_detail.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .menu{
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px;background-color: black;color: white">
        欢迎到来
        </div>
        <div>
            <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
                <a class="menu" href="/cmdb/user_info/">用户管理</a>
                <a class="menu" href="/cmdb/user_group/">用户组管理</a>
            </div>
        </div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 700px;overflow: auto;background-color: antiquewhite">
            <h1>用户详细信息</h1>
            <h2>{{ obj.id }}</h2>
            <h2>{{ obj.name }}</h2>
            <h2>{{ obj.password }}</h2>
        </div>
    </body>
    </html>
    
    
    
    
    
    
    
    templates/user_edit.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>编辑用户</h1>
        <form method="post" action="/cmdb/useredit-{{ obj.id }}/">
        <input style="display: none" type="text" name="id" value="{{ obj.id }}" />
        <input type="text" name="username" value="{{ obj.username }}" />
        <input type="text" name="password" value="{{ obj.password }}" />
        <input type="submit" name="提交" >
        </form>
    </body>
    </html>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    19周 16章   Django 字段类型介绍
    
    
    字符串、数字、时间、二进制、自增
    
    
    
    
    # Create your models here.
    class UserGroup(models.Model):
        uid=models.AutoField(primary_key=True)
        caption=models.CharField(max_length=50)
    class UserInfo(models.Model):
        #自动创建 id列  自增主键
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=60)
        email=models.CharField(max_length=60)
        #gender=models.CharField(max_length=60,null=True)
        test=models.EmailField(max_length=20,null=True)
    
    
    
    更新表:
    
    password=models.CharField(max_length=60)
    
    make manage.py makemigrations
    
    make manage.py migrate
     
    
    
    增加表:
    
    1、
    
    email=models.CharField(max_length=60)
    
     1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
     2) Quit, and let me add a default in models.py
    Select an option: 1
    Please enter the default value now, as valid Python
    The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
    Type 'exit' to exit this prompt
    
    Invalid input: name 'jack' is not defined
    >>> 'bob'
    
    make manage.py makemigrations
    
    make manage.py migrate
    
    
    然后关掉软件,重新打开才生效。
    
    
    2、、
    
    gender=models.CharField(max_length=60,null=True)
    
       make manage.py makemigrations
    
       make manage.py migrate
     
    
    
    
    删除表:
    
    
    #gender=models.CharField(max_length=60,null=True)
    
    make manage.py makemigrations
    
       make manage.py migrate
    
    
    
    
    自增:
    
    
    class UserGroup(models.Model):
        uid=models.AutoField(primary_key=True)
        caption=models.CharField(max_length=50)
    
    
    
    
    
    
    19周 17章:Django ORM字段参数介绍: 这些都是在Django admin里面使用
    
    
    
        null                数据库中字段是否可以为空
        db_column           数据库中字段的列名
        db_tablespace
        default             数据库中字段的默认值
        primary_key         数据库中字段是否为主键
        db_index            数据库中字段是否可以建立索引
        unique              数据库中字段是否可以建立唯一索引
        unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
        unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
        unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
    
        verbose_name        Admin中显示的字段名称
        blank               Admin中是否允许用户输入为空   
    			
    			username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
    
        editable            Admin中是否可以编辑
        help_text           Admin中该字段的提示信息
        choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                            如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
    
        error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                            字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                            如:{'null': "不能为空.", 'invalid': '格式错误'}
    
        validators          自定义错误验证(列表类型),从而定制想要的验证规则
                   
    
        auto_now
    
    		uptime=models.DateTimeField(auto_now=True,null=True)
    
    		自动更新时间:
    
    		错误方式;
    
    		obj=UserGroup.objects.filter(id=1).update(caption='CEO')
    
    
    		正确方式;
    
    		obj=UserGroup.objects.filter(id=1).first()
        		obj.caption="CEO"
        		obj.save()
    
    
         choices  :用在admin
    
                   user_type_id=models.IntegerField(choices=user_type_choice,default=1)
    
    	      user_type_choice=(
            	(1,'超级用户'),
            	(2,'白金客户'),
            	(3,'普通客户'),
        	)
        		user_type_id=models.IntegerField(choices=user_type_choice,default=1)
    
    
    
    
    19周 18章:Django ORM外键操作
    
    
    
    
    外键的意思:
    
    主要作用就是把两个数据库表连接起来,比如把员工组表、员工信息表给连接起来
    
    
    注意python3.7外键的变化:
    
    
    user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
    
    注意:怎么取里面的值
    
    row.user_group 是个对象
    
    user_list=Userinfo.object.all()
    
    for row in user_list:
    
    	print(row.user_group_id) = print(row.user_group.uid)
    
            print(row.user_group.caption)
    
    
    
    
    <ul>
                {% for row in user_list %}
                    <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }}</a>
                    <span>{{ row.user_group.caption }}</span>
                    </li>
                {% endfor %}
    </ul>
    
    
    
    
    
    
    实例:接之前的,变动的如下:
    
    
    
    app01/models.py
    
    
    from django.db import models
    
    # Create your models here.
    class UserGroup(models.Model):
        uid=models.AutoField(primary_key=True)
        caption=models.CharField(max_length=50)
        ctime=models.DateTimeField(auto_now_add=True,null=True)
        uptime=models.DateTimeField(auto_now=True,null=True)
        #username=models.CharField(max_length=50,blank=True)
    
    
    class UserInfo(models.Model):
        #自动创建 id列  自增主键
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=60)
        email=models.CharField(max_length=60)
        #gender=models.CharField(max_length=60,null=True)
        test=models.EmailField(max_length=20,null=True)
        username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
        user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
        user_type_choice=(
            (1,'超级用户'),
            (2,'白金客户'),
            (3,'普通客户'),
        )
        user_type_id=models.IntegerField(choices=user_type_choice,default=1)
    
    
    
    
    
    templates/user_info.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body {
                margin: 0;
            }
    
            .menu {
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
    <div style="height: 48px;background-color: black;color: white">
        欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 700px;overflow: auto;background-color: antiquewhite">
        <h3>添加用户</h3>
        <form action="/cmdb/user_info/" method="post">
            <input type="text" name="user"/>
            <input type="text" name="pwd"/>
            <input type="submit" value="添加"/>
        </form>
        <h3>用户列表</h3>
        <ul>
            {% for row in user_list %}
                <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }} </a> |
                    <span>{{ row.user_group.caption }}</span>
                <a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a> |
                <a href="/cmdb/useredit-{{ row.id }}/"> 编辑 </a>
                </li>
            {% endfor %}
        </ul>
    </div>
    </body>
    </html>
    
    
    
    
    第19章/urls.py
    
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    from django.conf.urls import url,include
    import urllib
    urlpatterns = [
    
        path('login/', views.login),
        path('index/', views.index,),
        path('user_info/', views.user_info,),
        url(r'^userdetail-(?P<nid>d+)/', views.user_detail,),
        url(r'^userdel-(?P<nid>d+)/', views.user_del,),
        url(r'^useredit-(?P<nid>d+)/', views.user_edit,),
        path('orm/', views.orm),
    
        ]
    
    
    
    
    19周 19章:  外键实现增加用户(含select标签)
    
    
    
    
    注意下面多个是这么写:弄得好苦
    
    return render(request,'user_info.html',{'user_list':user_list,"group_list":group_list})
    
    
    
    
    
    
    app01/views.py
    
    
    
    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from django.shortcuts import redirect
    from app01 import models
    import urllib
    # Create your views here.
    
    # USER_DICT={
    #     'k1':'root1',
    #     'k2':'root2',
    #     'k3':'root3',
    #     'k4':'root4',
    # }
    USER_DICT={
        '1':{'name':'root1','email':'root@123.com'},
        '2':{'name':'root2','email':'root@123.com'},
        '3':{'name':'root3','email':'root@123.com'},
        '4':{'name':'root4','email':'root@123.com'}
    }
    
    def index(request):
        return render(request,'index.html')
    def user_info(request):
        if request.method=="GET":
            user_list=models.UserInfo.objects.all()
            group_list=models.UserGroup.objects.all()
    
            return render(request,'user_info.html',{'user_list':user_list,"group_list":group_list})
    
        elif request.method=="POST":
            u=request.POST.get('user')
            p=request.POST.get('pwd')
            models.UserInfo.objects.create(username=u,password=p)
            user_list=models.UserInfo.objects.all()
        #print(user_list.query)
            return render(request,'user_info.html',{'user_list':user_list})
    def user_del(request,nid):
        models.UserInfo.objects.filter(id=nid).delete()
        return redirect('/cmdb/user_info/')
    def user_edit(request,nid):
        if request.method=='GET':
            obj=models.UserInfo.objects.filter(id=nid).first()
            return render(request,'user_edit.html',{'obj':obj})
        elif request.method=='POST':
            nid=request.POST.get('id')
            u=request.POST.get('username')
            p=request.POST.get('password')
            models.UserInfo.objects.filter(id=nid).update(username=u,password=p)
            return redirect('/cmdb/user_detail/')
    
    def user_detail(request,nid):
        obj=models.UserInfo.objects.filter(id=nid).first()
    
        return render(request,'user_detail.html',{'obj':obj})
    
    
    
    def login(request):
        #models.UserGroup.objects.create(caption='DBA')
        if request.method=="GET":
            return render(request,'login.html')
        elif request.method=="POST":
            #数据库中执行 select 判断用户名和密码是否中确
            u=request.POST.get('user')
            p=request.POST.get('pwd')
            #count=models.UserInfo.objects.filter(username=u,password=p).count() 也可以,但是不经常用
            obj=models.UserInfo.objects.filter(username=u,password=p).first()
            #print(obj)
            #下面意思:如果obj为真
            if obj:
                return redirect('/cmdb/index/')
            else:
                return render(request,'login.html')
    
        else:
            return redirect('/index/')
    
    
    def orm(request):
        #创建
        #models.UserInfo.objects.create(username='root',password='123',)
        # obj=models.UserInfo(username='bob',password='456')
        # obj.save()
        # dic={'username':'jack','password':'789'}
        # models.UserInfo.objects.create(dic)
        #查
        result=models.UserInfo.objects.all()
        #result=models.UserInfo.objects.filter(username='root',password=999)
        models.UserInfo.objects.create(
            username='root1',
            password=123,
            email='123@.com',
            test='ceshi',
            user_group_id=1,
        )
        #删除:
        #models.UserInfo.objects.filter().delete()
        #更新
        #models.UserInfo.objects.all().update(password=888)
        # obj=models.UserInfo.objects.filter(id=3)
        # for i in obj:
        #     print(i.username)
        #
        return HttpResponse('orm')
    
    # from django.views import View
    #
    # class Home(View):
    #     def dispatch(self, request, *args, **kwargs):
    #         print('before')#kkkk
    #         result=super(Home,self).dispatch(request, *args, **kwargs)
    #         print('after')
    #         return result
    #
    #     def get(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    #     def post(self,request):
    #         print(request.method)
    #         return render(request,'home.html')
    
    
    
    
    
    
    
    
    app01/models.py
    
    
    
    
    from django.db import models
    
    # Create your models here.
    class UserGroup(models.Model):
        uid=models.AutoField(primary_key=True)
        caption=models.CharField(max_length=50)
        ctime=models.DateTimeField(auto_now_add=True,null=True)
        uptime=models.DateTimeField(auto_now=True,null=True)
        #username=models.CharField(max_length=50,blank=True)
    
    
    class UserInfo(models.Model):
        #自动创建 id列  自增主键
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=60)
        email=models.CharField(max_length=60)
        #gender=models.CharField(max_length=60,null=True)
        test=models.EmailField(max_length=20,null=True)
        username=models.CharField(max_length=50,blank=True,verbose_name='用户名')
        user_group=models.ForeignKey("UserGroup",to_field='uid',default=1,on_delete=models.CASCADE)
        user_type_choice=(
            (1,'超级用户'),
            (2,'白金客户'),
            (3,'普通客户'),
        )
        user_type_id=models.IntegerField(choices=user_type_choice,default=1)
    
    
    
    
    
    
    
    
    app01/urls.py
    
    
    
    
    """第19章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    from django.conf.urls import url,include
    import urllib
    urlpatterns = [
    
        path('login/', views.login),
        path('index/', views.index,),
        path('user_info/', views.user_info,),
        url(r'^userdetail-(?P<nid>d+)/', views.user_detail,),
        url(r'^userdel-(?P<nid>d+)/', views.user_del,),
        url(r'^useredit-(?P<nid>d+)/', views.user_edit,),
        path('orm/', views.orm),
    
        ]
    
    
    
    
    
    
    
    templates/user_info.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body {
                margin: 0;
            }
    
            .menu {
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
    <div style="height: 48px;background-color: black;color: white">
        欢迎到来
    </div>
    <div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
            <a class="menu" href="/cmdb/user_info/">用户管理</a>
            <a class="menu" href="/cmdb/user_group/">用户组管理</a>
        </div>
    </div>
    <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 700px;overflow: auto;background-color: antiquewhite">
        <h3>添加用户</h3>
        <form action="/cmdb/user_info/" method="post">
            <input type="text" name="user"/>
            <input type="text" name="pwd"/>
            <select name="group_id">
                {% for item in group_list %}
                    <option value="{{ item.uid }}">{{ item.caption }}</option>
                {% endfor %}
            </select>
            <input type="submit" value="添加"/>
        </form>
        <h3>用户列表</h3>
        <ul>
            {% for row in user_list %}
                <li><a href="/cmdb/userdetail-{{ row.id }}/">{{ row.username }} </a> |
                    <span>{{ row.user_group.caption }}</span>
                <a href="/cmdb/userdel-{{ row.id }}/"> 删除 </a> |
                <a href="/cmdb/useredit-{{ row.id }}/"> 编辑 </a>
                </li>
            {% endfor %}
        </ul>
    </div>
    </body>
    </html>
    
    
    
    
    
    templates/index.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .menu{
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px;background-color: black;color: white">
        欢迎到来
        </div>
        <div>
            <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
                <a class="menu" href="/cmdb/user_info/">用户管理</a>
                <a class="menu" href="/cmdb/user_group/">用户组管理</a>
            </div>
        </div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 0;overflow: auto">
    
        </div>
    </body>
    </html>
    
    
    
    
    
    
    templates/login.html
    
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body >
        <form action="/cmdb/login/" method="POST" enctype="multipart/form-data">
            <p>
                <input type="text" name="user" placeholder="用户名">
            </p>
            <p>
                <input type="password" name="pwd" placeholder="密码">
            </p>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    
    
    
    
    
    
    
    
    templates/user_detail.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            body{
                margin: 0;
            }
            .menu{
                display: block;
                padding: 5px;
            }
        </style>
    </head>
    <body>
        <div style="height: 48px;background-color: black;color: white">
        欢迎到来
        </div>
        <div>
            <div style="position: absolute;top: 48px;bottom: 0;left: 0; 200px;background-color: aquamarine">
                <a class="menu" href="/cmdb/user_info/">用户管理</a>
                <a class="menu" href="/cmdb/user_group/">用户组管理</a>
            </div>
        </div>
        <div style="position: absolute;top: 48px;bottom: 0;left: 210px; 700px;overflow: auto;background-color: antiquewhite">
            <h1>用户详细信息</h1>
            <h2>{{ obj.id }}</h2>
            <h2>{{ obj.name }}</h2>
            <h2>{{ obj.password }}</h2>
        </div>
    </body>
    </html>
    
    
    
    
    
    
    templates/user_edit.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>编辑用户</h1>
        <form method="post" action="/cmdb/useredit-{{ obj.id }}/">
        <input style="display: none" type="text" name="id" value="{{ obj.id }}" />
        <input type="text" name="username" value="{{ obj.username }}" />
        <input type="text" name="password" value="{{ obj.password }}" />
        <input type="submit" name="提交" >
        </form>
    </body>
    </html>
    
    
    
    
    访问:
    
    http://127.0.0.1:8000/cmdb/user_info/
    
    
    
    
    
    
    第20章 03节  Django 一对多创建介绍
    
    
    
    第20章 04节  Django 创建  一对多表结构
    
    
    
    1、先创建一个工程
    
    
    app01/models.py
    
    
    
    from django.db import models
    
    # Create your models here.
    
    class Business(models.Model):
        caption=models.CharField(max_length=32)
    class Host(models.Model):
        nid=models.AutoField(primary_key=True)
        hostname=models.CharField(max_length=32,db_index=True)
        ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
        port=models.IntegerField()
        b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
    
    
    
    
    
    
    第20章-05    获取单表数据的三种方式
    
    
    
    models.Business.objects.all()
    
    是个对象
    
    models.Business.objects.values('id','caption')
    
    #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
    
    models.Business.objects.values_list('id','caption')
    
    #[(1,运维),(2,市场)]  values_list 是个元组
    
    
    
    
    
    第20章/settings.py
    
    
    
    """
    Django settings for 第20章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'u#@z=2@*h^sph5$uqwo+gwgml#ivnq&l@b7-9jg8ve@pmv4z_6'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第20章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第20章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    
    app01/models.py
    
    
    
    
    from django.db import models
    
    # Create your models here.
    
    class Business(models.Model):
        caption=models.CharField(max_length=32)
        code=models.CharField(max_length=32,null=True)
    class Host(models.Model):
        nid=models.AutoField(primary_key=True)
        hostname=models.CharField(max_length=32,db_index=True)
        ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
        port=models.IntegerField()
        b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
    
    
    
    
    
    
    
    第20章/urls.py
    
    
    
    """第20章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        #path('business/', views.business,),
        url(r'^business/$', views.business,),
    ]
    
    
    
    
    
    app01/views.py
    
    
    
    from django.shortcuts import render
    
    # Create your views here.
    from app01 import models
    def business(request):
        v1=models.Business.objects.all()
        v2=models.Business.objects.values('id','caption')
        #[{'id':'1','caption':'运维','code':'sa'}] values 对象是个字典
        v3=models.Business.objects.values_list('id','caption')
        #[(1,运维),(2,市场)]  values_list 对象是个元组
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    
    
    
    
    
    
    templates/business.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表(对象)</h1>
        <ul>
            {% for row in v1 %}
            <li>{{ row.id }} - {{ row.caption }} - {{ row.code }}</li>
            {% endfor %}
        </ul>
        <h1>业务线列表(字典)</h1>
        <ul>
            {% for row in v2 %}
            <li>{{ row.id }} - {{ row.caption }} </li>
            {% endfor %}
        </ul>
        <h1>业务线列表(元组)</h1>
        <ul>
            {% for row in v3 %}
            <li>{{ row.0 }} - {{ row.1 }} </li>
            {% endfor %}
        </ul>
    </body>
    </html>
    
    
    
    
    
    
    第20章-06    一对多跨表操作
    
    
    
    
    实例接上面:
    
    
    
    第20章/settings.py
    
    
    
    """
    Django settings for 第20章 project.
    
    Generated by 'django-admin startproject' using Django 2.0.3.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.0/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.0/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = 'u#@z=2@*h^sph5$uqwo+gwgml#ivnq&l@b7-9jg8ve@pmv4z_6'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        #'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = '第20章.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = '第20章.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.0/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.0/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
        os.path.join(BASE_DIR,'static'),
    )
    
    
    
    
    
    app01/models.py
    
    
    
    from django.db import models
    
    # Create your models here.
    
    class Business(models.Model):
        caption=models.CharField(max_length=32)
        code=models.CharField(max_length=32,null=True)
    class Host(models.Model):
        nid=models.AutoField(primary_key=True)
        hostname=models.CharField(max_length=32,db_index=True)
        ip=models.GenericIPAddressField(protocol="both",max_length=32,db_index=True)
        port=models.IntegerField()
        b=models.ForeignKey(to="Business",to_field='id',on_delete=models.CASCADE)
    
    
    
    
    
    
    第20章/urls.py
    
    
    
    """第20章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        #path('business/', views.business,),
        url(r'^business/$', views.business,),
        url(r'^host/$', views.host,),
    ]
    
    
    
    
    
    
    app01/views.py
    
    
    
    
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from app01 import models
    def business(request):
        v1=models.Business.objects.all()
        v2=models.Business.objects.values('id','caption')
        #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
        v3=models.Business.objects.values_list('id','caption')
        #[(1,运维),(2,市场)]  values_list 是个元组
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
    def host(request):
        v1=models.Host.objects.filter(nid__gt=0)
        return render(request,'host.html',{'v1':v1})
    
    
    
    
    
    
    templates/business.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表(对象)</h1>
        <ul>
            {% for row in v1 %}
            <li>{{ row.id }} - {{ row.caption }} - {{ row.code }}</li>
            {% endfor %}
        </ul>
        <h1>业务线列表(字典)</h1>
        <ul>
            {% for row in v2 %}
            <li>{{ row.id }} - {{ row.caption }} </li>
            {% endfor %}
        </ul>
        <h1>业务线列表(元组)</h1>
        <ul>
            {% for row in v3 %}
            <li>{{ row.0 }} - {{ row.1 }} </li>
            {% endfor %}
        </ul>
    </body>
    </html>
    
    
    
    
    
    
    templates/host.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>业务线列表</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>ip地址</th>
                    <th>端口</th>
                    <th>业务线名称</th>
    
                </tr>
            </thead>
            <tbody>
                {% for row in v1 %}
                <tr ht_d="{{ row.nid }}" b_id="{{ row.b.id }}">
                    <th>{{ row.hostname }}</th>
                    <th>{{ row.ip }}</th>
                    <th>{{ row.port }}</th>
                    <th>{{ row.b.caption }}</th>
    
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </body>
    </html>
    
    
    
    
    第20周-07  一对多块表操作的三种方式
    
    
    
    接上面:
    
    
    app01/views.py
    
    
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from app01 import models
    def business(request):
        v1=models.Business.objects.all()
        # for row in v1:
        #     print(row.id,row.caption)
        v2=models.Business.objects.values('id','caption')
        # for row in v2:
        #     print(row['id'],row['caption'])
        #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
        v3=models.Business.objects.values_list('id','caption')
        #[(1,运维),(2,市场)]  values_list 是个元组
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
        #return HttpResponse('ok')
    def host(request):
        v1=models.Host.objects.filter(nid__gt=0)
        # for row in v1:
        #     print(row.nid,row.hostname)
        v2=models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
        # for row in v2:
        #     print(row['nid'],row['hostname'],row['b_id'])
        v3=models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
        # for row in v3:
        #     print(row[0],row[1])
        #return HttpResponse('ok')
        return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3})
    
    
    
    
    
    templates/host.html
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>主机列表(列表)</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>ip地址</th>
                    <th>端口</th>
                    <th>业务线名称</th>
    
                </tr>
            </thead>
            <tbody>
            
                {% for row in v1 %}
                <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                    <th>{{ row.hostname }}</th>
                    <th>{{ row.ip }}</th>
                    <th>{{ row.port }}</th>
                    <th>{{ row.b.caption }}</th>
    
                </tr>
                {% endfor %}
            <tbody>
        </table>
    
        <h1>主机列表(字典)</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>ip地址</th>
                    <th>端口</th>
                    <th>业务线名称</th>
    
                </tr>
            </thead>
            <tbody>
            
                {% for row in v1 %}
                <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                    <th>{{ row.hostname }}</th>
                    <th>{{ row.ip }}</th>
                    <th>{{ row.port }}</th>
                    <th>{{ row.b.caption }}</th>
    
                </tr>
                {% endfor %}
            <tbody>
        </table>
    
        <h1>业务线列表*(元组)</h1>
        <table border="1">
            <thead>
                <tr>
                    <th>主机名</th>
                    <th>ip地址</th>
    
                </tr>
            </thead>
            <tbody>
            
                {% for row in v3 %}
                <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
                    <th>{{ row.1 }}</th>
                    <th>{{ row.3 }}</th>
    
                </tr>
                {% endfor %}
            <tbody>
        </table>
    </body>
    </html>
    
    
    
    
    
    
    
    第20周-09 增加一对多数据示例;  --添加主机--用模态对话框演示:
    
    
    
    接上面:
    
    
    
    app01/views.py
    
    
    
    from django.shortcuts import render,HttpResponse,redirect
    
    # Create your views here.
    from app01 import models
    def business(request):
        v1=models.Business.objects.all()
        # for row in v1:
        #     print(row.id,row.caption)
        v2=models.Business.objects.values('id','caption')
        # for row in v2:
        #     print(row['id'],row['caption'])
        #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
        v3=models.Business.objects.values_list('id','caption')
        #[(1,运维),(2,市场)]  values_list 是个元组
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
        #return HttpResponse('ok')
    def host(request):
        if request.method=='GET':
            b_list=models.Business.objects.all()
        elif request.method=='POST':
            h=request.POST.get('hostname')
            i=request.POST.get('ip')
            p=request.POST.get('port')
            b=request.POST.get('b_id')
            models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
            return redirect('/host/')
        v1=models.Host.objects.filter(nid__gt=0)
        # for row in v1:
        #     print(row.nid,row.hostname)
        v2=models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
        # for row in v2:
        #     print(row['nid'],row['hostname'],row['b_id'])
        v3=models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
        # for row in v3:
        #     print(row[0],row[1])
        #return HttpResponse('ok')
        return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3,'b_list':b_list})
    
    
    
    
    
    
    templates/host.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide {
                display: none;
            }
    
            .shade {
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background: black;
                opacity: 0.6;
                z-index: 100;
            }
    
            .add-modal {
                position: fixed;
                height: 300px;
                 400px;
                top: 100px;
                left: 50%;
                z-index: 101;
                border: 1px solid red;
                background: white;
                margin-left: -200px;
            }
        </style>
    </head>
    <body>
    <h1>主机列表(列表)</h1>
    <div>
        <input id="add_host" type="button" value="添加">
    </div>
    <table border="1">
        <thead>
        <tr>
            <th>序号</th>
            <th>主机名</th>
            <th>ip地址</th>
            <th>端口</th>
            <th>业务线名称</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ forloop.counter }}</th>
                <th>{{ row.hostname }}</th>
    
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
    
            </tr>
        {% endfor %}
    
        <tbody>
    </table>
    
    <h1>主机列表(字典)</h1>
    <table border="1">
        <thead>
        <tr>
            <th>主机名</th>
            <th>ip地址</th>
            <th>端口</th>
            <th>业务线名称</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
    
            </tr>
        {% endfor %}
        <tbody>
    </table>
    
    <h1>主机列表*(元组)</h1>
    <table border="1">
        <thead>
        <tr>
            <th>主机名</th>
            <th>ip地址</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v3 %}
            <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
                <th>{{ row.1 }}</th>
                <th>{{ row.3 }}</th>
    
            </tr>
        {% endfor %}
        <tbody>
    </table>
    <div class="shade hide"></div>
    <div class="add-modal hide">
        <form method="post" action="/host/">
            <div class="group">
                <input type="text" placeholder="主机名" name="hostname">
            </div>
            <div class="group">
                <input type="text" placeholder="IP" name="ip">
            </div>
            <div class="group">
                <input type="text" placeholder="端口" name="port">
            </div>
            <div class="group">
    
                <select name="b_id">
                    {% for op in b_list %}
                    <option value="{{ op.id }}">{{ op.caption }}</option>
                    {% endfor %}
                </select >
    
                <input type="submit" value="提交">
                <input id="cancle" type="button" value="取消">
    
            </div>
        </form>
    </div>
    <script src="/static/jquery-3.2.1.js"></script>
    <script>
        $(function () {
            $('#add_host').click(function () {
                $('.add-modal,.shade').removeClass('hide');
            });
    
            $('#cancle').click(function(){
                $('.add-modal,.shade').addClass('hide');
            })
    
    
        })
    </script>
    </body>
    </html>
    
    
    
    
    
    
    第20周-09  初识Ajax  :返回另一个界面,弹出一个框
    
    
    
    接上面:
    
    
    
    templates/host.html 
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide {
                display: none;
            }
    
            .shade {
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background: black;
                opacity: 0.6;
                z-index: 100;
            }
    
            .add-modal {
                position: fixed;
                height: 300px;
                 400px;
                top: 100px;
                left: 50%;
                z-index: 101;
                border: 1px solid red;
                background: white;
                margin-left: -200px;
            }
        </style>
    </head>
    <body>
    <h1>主机列表(列表)</h1>
    <div>
        <input id="add_host" type="button" value="添加">
    </div>
    <table border="1">
        <thead>
        <tr>
            <th>序号</th>
            <th>主机名</th>
            <th>ip地址</th>
            <th>端口</th>
            <th>业务线名称</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ forloop.counter }}</th>
                <th>{{ row.hostname }}</th>
    
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
    
            </tr>
        {% endfor %}
    
        <tbody>
    </table>
    
    <h1>主机列表(字典)</h1>
    <table border="1">
        <thead>
        <tr>
            <th>主机名</th>
            <th>ip地址</th>
            <th>端口</th>
            <th>业务线名称</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
    
            </tr>
        {% endfor %}
        <tbody>
    </table>
    
    <h1>主机列表*(元组)</h1>
    <table border="1">
        <thead>
        <tr>
            <th>主机名</th>
            <th>ip地址</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v3 %}
            <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
                <th>{{ row.1 }}</th>
                <th>{{ row.3 }}</th>
    
            </tr>
        {% endfor %}
        <tbody>
    </table>
    <div class="shade hide"></div>
    <div class="add-modal hide">
        <form method="post" action="/host/">
            <div  class="group">
                <input id="host" type="text" placeholder="主机名" name="hostname">
            </div>
            <div  class="group">
                <input id="ip" type="text" placeholder="IP" name="ip">
            </div>
            <div  class="group">
                <input id="port" type="text" placeholder="端口" name="port">
            </div>
            <div class="group">
    
                <select id="sel" name="b_id">
                    {% for op in b_list %}
                    <option value="{{ op.id }}">{{ op.caption }}</option>
                    {% endfor %}
                </select >
    
                <input type="submit" value="提交">
                <a id="ajax_submit" style="display:inline-block;padding: 5px;background: blue;color: white">悄悄提交</a>
                <input id="cancle" type="button" value="取消">
    
            </div>
        </form>
    </div>
    <script src="/static/jquery-3.2.1.js"></script>
    <script>
        $(function () {
            $('#add_host').click(function () {
                $('.add-modal,.shade').removeClass('hide');
            });
    
            $('#cancle').click(function(){
                $('.add-modal,.shade').addClass('hide');
            });
    
            $('#ajax_submit').click(function(){
                $.ajax({
                    url:"/test_ajax/",
                    type:"POST",
                    data:{'hostname':$('#host').val(),'ip':$('#ip').val(),'port':$('#port').val(),'b_id':$('#sel').val()},
                    success:function(data){
                    if(data=='ok'){
                        location.reload()
                    }else {
                        alert(data)
                    }
    
                    }
                })
            })
    
        })
    </script>
    </body>
    </html>
    
    
    
    
    
    
    第20章/urls.py
    
    
    
    """第20章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        #path('business/', views.business,),
        url(r'^business/$', views.business,),
        url(r'^host/$', views.host,),
        url(r'^test_ajax/$', views.test_ajax,),
    ]
    
    
    
    
    
    
    app01/views.py
    
    
    
    from django.shortcuts import render,HttpResponse,redirect
    
    # Create your views here.
    from app01 import models
    def business(request):
        v1=models.Business.objects.all()
        # for row in v1:
        #     print(row.id,row.caption)
        v2=models.Business.objects.values('id','caption')
        # for row in v2:
        #     print(row['id'],row['caption'])
        #[{'id':'1','caption':'运维','code':'sa'}] values 是个字典
        v3=models.Business.objects.values_list('id','caption')
        #[(1,运维),(2,市场)]  values_list 是个元组
        return render(request,'business.html',{'v1':v1,'v2':v2,'v3':v3})
        #return HttpResponse('ok')
    def host(request):
        v1=models.Host.objects.filter(nid__gt=0)
        # for row in v1:
        #     print(row.nid,row.hostname)
        v2=models.Host.objects.filter(nid__gt=0).values('nid','hostname','b_id','b__caption')
        # for row in v2:
        #     print(row['nid'],row['hostname'],row['b_id'])
        v3=models.Host.objects.filter(nid__gt=0).values_list('nid','hostname','b_id','b__caption')
        # for row in v3:
        #     print(row[0],row[1])
        #return HttpResponse('ok')
        if request.method=='GET':
            b_list=models.Business.objects.all()
        elif request.method=='POST':
            h=request.POST.get('hostname')
            i=request.POST.get('ip')
            p=request.POST.get('port')
            b=request.POST.get('b_id')
            models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
            return redirect('/host/')
        return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3,'b_list':b_list})
    
    
    def test_ajax(request):
        print(request.method,request.POST)
        h=request.POST.get('hostname')
        i=request.POST.get('ip')
        p=request.POST.get('port')
        b=request.POST.get('b_id')
        if h and len(h) > 5:
            models.Host.objects.create(hostname=h,ip=i,port=p,b_id=b)
            return HttpResponse('ok')
        else:
            return HttpResponse('输入太短')
    
    
    
    
    访问:http://127.0.0.1:8000/host/
    
    
    
    
    
    
    第20周-10   Ajax内容整理;
    
    
    
    接上面:
    
    
    
    templates/host.html
    
    
    
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .hide {
                display: none;
            }
    
            .shade {
                position: fixed;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background: black;
                opacity: 0.6;
                z-index: 100;
            }
    
            .add-modal {
                position: fixed;
                height: 300px;
                 400px;
                top: 100px;
                left: 50%;
                z-index: 101;
                border: 1px solid red;
                background: white;
                margin-left: -200px;
            }
        </style>
    </head>
    <body>
    <h1>主机列表(列表)</h1>
    <div>
        <input id="add_host" type="button" value="添加">
    </div>
    <table border="1">
        <thead>
        <tr>
            <th>序号</th>
            <th>主机名</th>
            <th>ip地址</th>
            <th>端口</th>
            <th>业务线名称</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ forloop.counter }}</th>
                <th>{{ row.hostname }}</th>
    
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
    
            </tr>
        {% endfor %}
    
        <tbody>
    </table>
    
    <h1>主机列表(字典)</h1>
    <table border="1">
        <thead>
        <tr>
            <th>主机名</th>
            <th>ip地址</th>
            <th>端口</th>
            <th>业务线名称</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v1 %}
            <tr ht-d="{{ row.nid }}" b-id="{{ row.b.id }}">
                <th>{{ row.hostname }}</th>
                <th>{{ row.ip }}</th>
                <th>{{ row.port }}</th>
                <th>{{ row.b.caption }}</th>
    
            </tr>
        {% endfor %}
        <tbody>
    </table>
    
    <h1>主机列表*(元组)</h1>
    <table border="1">
        <thead>
        <tr>
            <th>主机名</th>
            <th>ip地址</th>
    
        </tr>
        </thead>
        <tbody>
    
        {% for row in v3 %}
            <tr ht-d="{{ row.0 }}" b-id="{{ row.2 }}">
                <th>{{ row.1 }}</th>
                <th>{{ row.3 }}</th>
    
            </tr>
        {% endfor %}
        <tbody>
    </table>
    <div class="shade hide"></div>
    <div class="add-modal hide">
        <form method="post" action="/host/">
            <div class="group">
                <input id="host" type="text" placeholder="主机名" name="hostname">
            </div>
            <div class="group">
                <input id="ip" type="text" placeholder="IP" name="ip">
            </div>
            <div class="group">
                <input id="port" type="text" placeholder="端口" name="port">
            </div>
            <div class="group">
    
                <select id="sel" name="b_id">
                    {% for op in b_list %}
                        <option value="{{ op.id }}">{{ op.caption }}</option>
                    {% endfor %}
                </select>
    
                <input type="submit" value="提交">
                <a id="ajax_submit" style="display:inline-block;padding: 5px;background: blue;color: white">悄悄提交</a>
                <input id="cancle" type="button" value="取消">
                <span id="error_msg"></span>
    
            </div>
        </form>
    </div>
    <script src="/static/jquery-3.2.1.js"></script>
    <script>
        $(function () {
            $('#add_host').click(function () {
                $('.add-modal,.shade').removeClass('hide');
            });
    
            $('#cancle').click(function () {
                $('.add-modal,.shade').addClass('hide');
            });
    
            $('#ajax_submit').click(function () {
                $.ajax({
                    url: "/test_ajax/",
                    type: "POST",
                    data: {
                        'hostname': $('#host').val(),
                        'ip': $('#ip').val(),
                        'port': $('#port').val(),
                        'b_id': $('#sel').val()
                    },
                    success: function (data) {
                        var obj = JSON.parse(data);
    
                        if (obj.status) {
                            location.reload()
                        } else {
                            $('#error_msg').text(obj.error);
                        }
    
                    }
                })
            })
    
        })
    </script>
    </body>
    </html>
    
    
    
    
    
    
    app01/views.py
    
    
    
    
    from django.shortcuts import render, HttpResponse, redirect
    
    # Create your views here.
    from app01 import models
    
    
    def business(request):
        v1 = models.Business.objects.all()
        # for row in v1:
        #     print(row.id,row.caption)
        v2 = models.Business.objects.values('id', 'caption')
        # for row in v2:
        #     print(row['id'],row['caption'])
        # [{'id':'1','caption':'运维','code':'sa'}] values 是个字典
        v3 = models.Business.objects.values_list('id', 'caption')
        # [(1,运维),(2,市场)]  values_list 是个元组
        return render(request, 'business.html', {'v1': v1, 'v2': v2, 'v3': v3})
        # return HttpResponse('ok')
    
    
    def host(request):
        v1 = models.Host.objects.filter(nid__gt=0)
        # for row in v1:
        #     print(row.nid,row.hostname)
        v2 = models.Host.objects.filter(nid__gt=0).values('nid', 'hostname', 'b_id', 'b__caption')
        # for row in v2:
        #     print(row['nid'],row['hostname'],row['b_id'])
        v3 = models.Host.objects.filter(nid__gt=0).values_list('nid', 'hostname', 'b_id', 'b__caption')
        # for row in v3:
        #     print(row[0],row[1])
        # return HttpResponse('ok')
        if request.method == 'GET':
            b_list = models.Business.objects.all()
        elif request.method == 'POST':
            h = request.POST.get('hostname')
            i = request.POST.get('ip')
            p = request.POST.get('port')
            b = request.POST.get('b_id')
            models.Host.objects.create(hostname=h, ip=i, port=p, b_id=b)
            return redirect('/host/')
        return render(request, 'host.html', {'v1': v1, 'v2': v2, 'v3': v3, 'b_list': b_list})
    
    
    def test_ajax(request):
        import json
        ret={'status':True,'error':None,'data':None}
        try:
    
            h = request.POST.get('hostname')
            i = request.POST.get('ip')
            p = request.POST.get('port')
            b = request.POST.get('b_id')
            if h and len(h) > 5:
                models.Host.objects.create(hostname=h, ip=i, port=p, b_id=b)
            else:
                ret['status']=False
                ret['error']='太短'
        except Exception as e:
            ret['status']=False
            ret['error']='请求错误'
        return HttpResponse(json.dumps(ret))
    
    
    
    
    
    
    第20章/urls.py
    
    
    
    
    """第20章 URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.0/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from app01 import views
    from django.conf.urls import url
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        #path('business/', views.business,),
        url(r'^business/$', views.business,),
        url(r'^host/$', views.host,),
        url(r'^test_ajax/$', views.test_ajax,),
    ]
    
    
    
    
    
    
    
    第20周-第11章节-Python3.5-编辑一对多示例
    
    
    
    
    
    
    第21周-第05章节-Python3.5-视图获取用户请求相关信息以及请求头
    
    
    
    from django.core.handlers.wsgi import WSGIRequest
    
    
    
    print(request.environ)
    
    
    
    for k,v in request.environ.items():
            print(k,v)
    
    
    
    
    
    
    第21周-第06章节-Python3.5-模板之继承
    
    
    
    master.html
    
    
    写好框架代码,然后在中间加上下面这句话,就可以被继承
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
    
    
    .add-modal {
                position: fixed;
                height: 300px;
                 400px;
                top: 100px;}
    
    
    {% block css %}{% endblock %}
    
    <head>
    
    
    <body>
    
    框架代码
    
    {% block content %}{% endblock %}
    
    框架代码
    
    <script src="/static/jquery-3.2.1.js"></script>
    {% block js %}
    {% endblock %}
    
    <body>
    
    
    
    
    
    ceshi.html    
    
    注意:其他html想定制jss和css时候,模板文件需要先写好block的位置,
    
    写css和js没有顺序分
    
    导入重复用的框架代码:
    
    {% extends 'master.html' %}
    
    
    {% block title %}用户管理{% endblock %}
    
    
    {% block content %}
    
    <ul>
            {% for row in v1 %}
            <li>{{ row.id }} - {{ row.caption }} - {{ row.code }}</li>
            {% endfor %}
        </ul>
    
    {% endblock %}
    
    
    {% block js %}
    <script>内容</script>
    {% endblock %}
    
    
    {% block css %}内容 {%endblock %}
    
    
    
    
    
    
    
    第21周-第07章节-Python3.5-模板之导入
    
    
    
    在需要导入html的位置 加上:{% include tag.html %}   有多个就循环
    
    
    
    
    
    
    第21周-第09章节-Python3.5-自定义 simple_tag
    

      

  • 相关阅读:
    推导式
    解构
    for 循环
    运算符
    while 循环
    流程控制语句
    索引和切片
    ASC转换BCD,ASC2BCD(转)
    CString和char互转,十六进制的BYTE转CString
    C++添加简单的日记记录
  • 原文地址:https://www.cnblogs.com/effortsing/p/9985808.html
Copyright © 2020-2023  润新知