西窗晓岩
我来不及认真地年轻,待明白过来时,只能选择认真地老去。

导航

 

1、对haproxy配置文件进行查、增,删(文件操作实战)

需求:

(1)、可以查找指定的backend

(2)、可以插入新的的backend

(3)、可以删除指定的backend

代码实现:

# 查询
def serach(str):
    with open("ha.cnf", 'r') as f:
        flag = False
        for line in f:
            if flag == True:
                return line
                break
            if line.strip() == "backend %s" % str:
                flag = True
    return False

# 插入
def insert(str):
    istr = eval(str)  # 将字符串转字典
    if serach(istr['backend']) == False:
        with open("ha.cnf", "a") as f:
            f.write('''\nbackend %s \n\t\tserver %s weight %s maxconn %s''' % (istr['backend'], istr['server'], istr['weight'], istr['maxconn']))
    else:
        print("this line have exist!")

# 删除
def delete(str):
    if serach(str) != False:
        with open("ha.cnf", "r") as f, open("ha.temp", "w") as ftemp:
            flag = False
            for line in f:
                if line.strip() == "backend %s" % str:
                    flag = True
                else:
                    if flag != True:
                        ftemp.write(line)
                    else:
                        flag = False

# 选择操作
select = input("please select:\n 1.search 2.insert 3.delete\n")

if select == "1":
    node = input("\nnode:")
    a = serach(node)
    print(a)
elif select == "2":
    insert("{'backend': 'www.baidu.com', 'server': '1.1.1.1', 'weight': '20', 'maxconn': '3000'}")
elif select == "3":
    a = input("\nnode:")
    delete(a)

 配置文件:ha.cnf

global
        log 127.0.0.1 local2
        daemon
        maxconn 256
        log 127.0.0.1 local2 info
defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option  dontlognull

listen stats :8888
        stats enable
        stats uri       /admin
        stats auth      admin:1234

frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www

backend www.oldboy.org
        server 100.1.7.9 weight 20 maxconn 3000

backend abc
        server 1.1.1.1 weight 20 maxconn 3000

backend www.baidu.com 
        server 1.1.1.1 weight 20 maxconn 3000
ha.cnf

 2、模拟网站登录(装饰器实战)

需求:

(1)访问页面需要登录验证账号

(2)不同页面采用不同的登录方式(比如jd账号或者weixin账号)

(3)登录后访问其他页面无需再登录验证账号

(4)可选择页面及有返回主页功能

代码实现:

# 是否已经登录标志
loginflag = False

def login_type(login_type): # 不同页面用不同账户登录
    def auth_account(fun): # 验证
        def wapped():
            global loginflag
            if loginflag == False:   # 如果没有登录
                user = input("\ninput your name:")
                pw = input("\ninput yout password:")
                if readdb(login_type, user, pw) == True: # 读取账号文件,是否是合法账号
                    loginflag = True
                    fun()
                else:
                    print('login error!')
            else:
                fun()
        return wapped
    return auth_account

# 读取账号文件,并判断账号密码是否正确
def readdb(login_type, username, passwd):
    with open(login_type, 'r') as f:
        for line in f:
            if line.strip().split(':')[0] == username and line.strip().split(':')[1] == passwd:
                return True
            else:
                return False

# 主页面
@login_type("jd")
def home():
    print("jd home!")
    s = input("\nselect web: 1,book  2,elec  q,quit")
    if s == '1':
        book()
    elif s == '2':
        elec()
    elif s == 'q':
        exit()

# 书城页面
@login_type("weixin")
def book():
    print("\njd book!")
    s = input("\nselect: q,quit system  r,return home")
    if s == 'q':
       pass
    elif s == 'r':
        home()

# 电子页面
@login_type("jd")
def elec():
    print("\njd elec!")
    s = input("\nselect: q,quit system  r,return home")
    if s == 'q':
        pass
    elif s == 'r':
        home()

# 选择登录的页面
s = input("select login web: 1,home   2,book  3,elec\n")
if s == '1':
    print("\nuse jd asscount")
    home()
elif s == '2':
    print("\nuse weixin asscount")
    book()
elif s == '3':
    print("\nuse jd asscount")
    elec()
else:
    exit()

 账号文件如下:

zhangsan:123456
jd
lisi:778899
weixin

 3、模拟计算器(re模块正则实战)

eg.

please input:(5+6)*2-10/(5-3)
显示结果:17.0

代码实现:

import re
# 运算式进行计算
def cal(str):
    # 判断字符串是否含有运算符(是否需要运算),是否是一位负数,如果是一位负数不进行计算
    if re.findall('[+\-*/]', str) and not(str[0] == '-' and len(str) == 2):
            # 先进行乘除运算,将所有乘除递归完
            if re.search('[*/]', str):
                current = re.search('\d+[*/]\d+', str).group()
                before = str.split(current, 1)[0]
                after = str.split(current, 1)[1]
                val = eval(current)
                str = '''%s%s%s''' % (before, val, after)
                return cal(str)
            else:  # 无乘除进行加减运算
                val = eval(str)
                return val
    else:
        return str

# 去除括号并调用运算函数
def del_bracket(str):
    # 递归去括号
    if re.findall('[()]', str):
        current = re.search('\([^()]+\)', str).group()
        before = str.split(current, 1)[0]
        after = str.split(current, 1)[1]
        val = cal(re.sub('[()]', '', current))
        str = '''%s%s%s''' % (before, val, after)
        return del_bracket(str)
    else: # 如果无括号,直接调用运算函数
        val = cal(str)
        return val

test = input("please input:")
# 去除空格
test.replace(' ', '')
# 是否含有非运算符和数字,是否正反括号数量不一致,是否含有运算符连续出现
if not(re.findall('[^0-9+\-*/().]', test)) and len(re.findall('\(', test)) == len(re.findall('\)', test)) and not(re.search('(\-\+)|(\-/)|(\-\*)|(\+\*)|(\*\+)|(\*/)|(/\*)|(\.\.)', test)):
    print(del_bracket(test))
else:
    print("error")

 

posted on 2017-09-26 17:48  西窗晓岩  阅读(144)  评论(0)    收藏  举报