Python基础-练习题

一、通过读取列表数据,写一个登录程序:

users=[    
      ['Amy', '123456'],
      ['Ann', '456789'],
      ['Sarah', '123456abc']   
]

1、登录,输入账号和密码,最多输入3次,3次还没有登录成功,提示次数超数

2、登录成功,提示:欢迎XXX登录,今日的日期是XXX,程序结束

3、账号和密码不能为空,要提示不能为空 ---字符串方法

4、账号和密码输入错误,提示错误,继续登录

5、输入的账号不存在,提示用户,算输错1次

编写程序题目分析:

 代码如下:

import datetime
users=[
      ['Amy', '123456'],
      ['Ann', '456789'],
      ['Sarah', '123456abc']
]
usernames = []
passwords = []
for user in users:
    username,password = user
    usernames.append(username)
    passwords.append(password)
# print(usernames)
# print(passwords)
for i in range(3):
    username = input('请输入用户名:')
    password = input('请输入登录密码:')
    if len(username) == 0 or password.strip() == '':
    #  len() 长度为0 和 空字符串,效果是一样的
        print('用户名或密码不能为空!')
    elif username not in usernames:
        print('用户名不存在')
    else:
        # index = usernames.index(username)
        # pwd = passwords[index]
        # if pwd == password:
        if [username,password] in users:
            print('欢迎%s登录,今天是%s! '%(username,datetime.datetime.today()))
            break
        else:
            print('用户名或密码错误!')
else:
    print('错误次数过多!')

二、通过读取文件,进行注册用户以及用户登录

1、程序用户注册,账号和密码存在文件里面:

(1)最多输入3次

(2)输入账号和密码,确认密码,密码长度在6-12位之间(注:密码包含大小写字母,数字)

(3)输入为空要提示

(4)用户已经存在不能注册

(5)两次密码要输入一致

编写程序题目分析:

代码如下:

f = open('users.txt','a+',encoding='utf-8')
f.seek(0)
usernames = []
for line in f.readlines():
    line = line.strip()    # 防止文件里有空行
    if line:
        username = line.split(',')[0]
        usernames.append(username)

for i in range(3):
    username = input('username:').strip()
    password = input('password:').strip()
    cpassword = input('cpassword:').strip()
    if not username or not password or not cpassword:
        print('账号/密码不能为空!')
    elif len(password) <6 or len(password) >12:
        print('密码长度在6-12之间!')
    elif password != cpassword:
        print('两次输入的密码不一致!')
    else:
        l,u,d = False,False,False
        for p in password:
            if p.islower():
                l = True
            elif p.isupper():
                u = True
            elif p.isdigit():
                d = True
        if not l or not u or not d :
            print('密码必包含大小写字母,和数字!')
        elif username in usernames:
            print('用户已存在!')
        else:
            f.write('%s,%s
'%(username,password))
            print('注册成功!')
            break
else:
    print('错误次数过多!')
f.close()

2、用户登录程序,账号和密码从文件里面取

(1)最多输入3次

(2)账号和密码的为空校验

(3)不存在要提示

(4)登录成功结束

编写程序题目分析:

代码如下:

f = open('users.txt',encoding='utf-8')
users = {}
for line in f.readlines():
    line = line.strip()
    if line:
        username = line.split(',')[0]
        password = line.split(',')[1]
        users[username] = password
for i in range(3):
    username = input('username:').strip()
    password = input('password:').strip()
    if not username or not password :
        print('账号/密码不能为空!')
    elif len(password) < 6 or len(password) > 12:
        print('密码长度在6-12之间!')
    elif username not in users:
        print('用户不存在!')
    elif password != users.get(username):
        print('密码错误!')
    else:
        print('欢迎登录!')
        break
else:
    print('错误次数超限!')
f.close()

三、写一个管理商品的程序,商品文件格式在(product.json)里面(1、查看商品 2、新增商品 3、修改商品信息 4、删除商品)

商品文件信息(product.json):

{
  "mac book":{
    "count": 50,
    "price": 8999
  },
  "矿泉水":{
    "count": 100,
    "price": 1.1
  }
}

提供商品的增删改查功能:

(1)choice = input('请输入你的选择:1、查看商品 2、新增商品 3、修改商品 4、删除商品')

(2)查看商品,输入商品名称,print单个商品的信息,价格,数量,输入all,查看所有商品

(3)新增商品,输入商品名称、数量、价格,数量是大于0的整数,价格必须是大于0的数值,如果商品存在,无法添加

(4)修改商品,输入商品名称、数量、价格,商品存在才可以修改,数量是大于0的整数,价格必须是大于0的数值

(5)输入商品名称,如果存在,删除

编写程序题目分析:

代码如下:

import json

file_name = 'product.json' # 文件名称不会发生变化,故定义常量
# 定义读取商品函数
def read_products():
    with open(file_name,encoding='utf-8') as fr:
        return json.load(fr)
# 定义写入商品函数
def write_products(data):
    with open(file_name,'w', encoding='utf-8') as fw:
        json.dump(data,fw,ensure_ascii=False,indent=4)

# 定义数量函数
def is_digit(number):
    s = str(number)
    if s.isdigit():
        if int(s) > 0:
            return True

# 定义价格函数
def is_price(price):   # >0的整数和小数都可以
    s = str(price)
    if is_digit(s):
            return True
    else:
        if s.count('.') == 1:    #1.3
            left,right = s.split('.')
            if left.isdigit() and right.isdigit(): # 正整数 0.0
                if float(s) > 0:
                    return True
# 定义查看商品函数
def show_product():
    # 第一种先读取商品文件信息,然后输入商品名称,接下来作判断
    # products = read_products()
    # product_name = input('请输入商品名称:').strip()
    # if not product_name:
    #     print('请输入商品名称:')
    # elif product_name == 'all':
    #     print(products)
    # elif product_name not in products:
    #     print('商品不存在!')
    # else:
    #     product = products.get(product_name)
    #     print('商品信息:',product)
    # 第二种先输入商品名称,然后读取文件,接下来进行判断(推荐使用)
    product_name = input('请输入商品名称:').strip
    if product_name:
        products = read_products()
        if product_name == 'all':
            print(products)
        elif product_name not in products:
            print('商品不存在!')
        else:
            product = products.get(product_name)
            print('商品信息:',product)
    else:
        print('不能为空!')

# 定义新增商品函数
def add_product():
        product_name = input('请输入商品名称:').strip()
        price = input('请输入商品价格').strip()
        count = input('请输入商品数量:').strip()
        if product_name and price and count:
            if is_price(price) and is_digit(count):
                products = read_products()
                if product_name not in products:
                    products[product_name] = {"count":count,"price":price}
                    write_products(products)
                    print('商品新增成功!')
                else:
                    print('商品已经存在!')
            else:
                print('价格/数量不合法!')
        else:
            print('不能为空!')

# 定义修改商品函数
def modify_product():
    product_name = input('请输入商品名称:').strip()
    price = input('请输入商品价格').strip()
    count = input('请输入商品数量:').strip()
    if product_name and price and count:
        if is_price(price) and is_digit(count):
            products = read_products()
            if product_name in products:
                products[product_name] = {"count": count, "price": price}
                write_products(products)
                print('商品修改成功!')
            else:
                print('商品不存在')
        else:
            print('价格/数量不合法!')
    else:
        print('不能为空!')

# 定义删除商品函数
def del_product():
    product_name = input('请输入商品名称:').strip()
    if product_name:
        products = read_products()
        if product_name not in products:
            print('商品不存在!')
        else:
            products.pop(product_name)
            write_products(products)
    else:
        print('不能为空!')
# 商品管理
choice = input('1、查看商品 2、新增商品 3、修改商品 4、删除商品')
func_map = {'1': show_product(), '2': add_product(),'3': modify_product(),'4':del_product()}
if choice in func_map:
    func_map[choice]
else:
    print('请输入正确的选项!')

四、写一个删除日志的脚本,把三天前的日志并且为空的日志删除

1、首先需要执行造日志的脚本文件:造日志的脚本.py

def timestamp_to_str(timestamp=None,format='%Y-%m-%d %H:%M:%S'):
    '''时间戳转格式化好的时间,如果没有传时间戳,就获取当前的格式化时间'''
    if timestamp:
        time_tuple = time.localtime(timestamp) #把时间戳转成时间元组
        result = time.strftime(format,time_tuple) #把时间元组转成格式化好的时间
        return result
    else:
        return time.strftime(format)


import time,os,random
l = ['ios','android','nginx','tomcat','python','blog','apache','mysql','redis']

for i in l:
    p = os.path.join('logs',i)
    os.makedirs(p)
    for j in range(30):
        t = int(time.time())-86400*j
        time_str = timestamp_to_str(t,'%Y-%m-%d')
        log_name = '%s_%s.log'%(i,time_str)
        abs_file_path = os.path.join('logs',i,log_name)
        fw = open(abs_file_path, 'w', encoding='utf-8')
        if random.randint(1,10)%2==0:
            fw.write('胜多负少防守打法双方都')
        fw.close()

2、编写程序题目分析:

3、代码如下:

import os
import time

day = 60*60*24*3

def str_to_timestamp(str_time,format='%Y-%m-%d'):
    time_tuple = time.strptime(str_time,format)
    return int(time.mktime(time_tuple))

def clean_log(path):
    if os.path.isdir(path):
        for cur_path,dirs,files in os.walk(path):
            for file in files:
                if file.endswith('.log'):  # android_2020-09-04.log
                    file_time = file.split('.')[0].split('_')[-1]
                    file_time_stamp = str_to_timestamp(file_time)
                    ago_time_stamp = time.time() - day
                    file_abs_path = os.path.join(cur_path,file)
                    if file_time_stamp < ago_time_stamp or os.path.getsize(file_abs_path)==0:
                        if time.strftime('%Y-%m-%d') in file:
                            continue
                        os.remove(file_abs_path)
    else:
        print('路径错误!')

clean_log('logs')

五、写一个产生双色球号码的程序,输入几就产生多少条:

1、产生的里面不能有重复的

2、产生的号码要1 2 3 4 5 6

3、红色球号码从1--33中选择

4、蓝色球号码从1--16中选择

例如:01 02 03 04 05 06 07

编写程序题目分析:

代码如下:

# 第一种方法
import random
number = input('number:').strip()
if number.isdigit() and int(number) >0:
     l = []
     while True:
         red = random.sample(range(1,34),6)
         red.sort()
         blue = random.sample(range(1,17),1)
         result = red + blue
         result = [str(ball).zfill(2) for ball in result]
         seq = ' '.join(result)
         if seq not in l:
             l.append(seq)
             print('生成的双色球号码是:红球:%s 蓝球:%s' %(' '.join(result[:6]),result[-1]))
         if int(number) == len(l):
             break
# 第二种方法
import random
reds = [str(ball).zfill(2) for ball in range(1,34)]
blues = [str(ball).zfill(2) for ball in range(1,17)]

number = input('number:').strip()
if number.isdigit() and int(number) >0:
    l = set()
    while int(number) !=len(l):
        red = random.sample(reds,6)
        red.sort()
        blue = random.sample(blues,1)
        result = red + blue
        result = [str(ball).zfill(2) for ball in result]
        seq = ' '.join(result) + '
'
        l.add(seq)
        print('生成的双色球号码是:红球:%s 蓝球:%s' %(' '.join(result[:6]),result[-1]))

with open('seq.txt','w',encoding='utf-8') as fw:
    fw.writelines(l)

六、写一个函数,传入一个表名,把整个表里面的数据导出到excel

1、编写程序题目分析

2、方法一:export_table_to_excel.py

import pymysql,xlwt
table_name = input('请输入你要导出的表名:').strip()
conn=pymysql.connect(host='118.24.3.40',user = 'jxz',
                        password = '123456',db = 'jxz',
                        charset='utf8',autocommit=True)   #若不插入charset,有可能出现乱码

cur = conn.cursor(pymysql.cursors.DictCursor)

#MySQL判断表是否存在:SELECT table_name FROM information_schema.TABLES WHERE table_name ='yourname';
table_exist_sql = "SELECT table_name FROM information_schema.TABLES WHERE table_name ='%s';"% table_name
cur.execute(table_exist_sql)
if cur.fetchall(): query_sql = 'select * from %s;' % table_name cur.execute(query_sql) data = cur.fetchall() if data: book = xlwt.Workbook() #todo,没有处理表头 sheet = book.add_sheet('sheet1') for index,key in enumerate(data[0]): #写表头 sheet.write(0,index,key) for row,item in enumerate(data,1): #写数据 for col,value in enumerate(item.values()): sheet.write(row,col,value) book.save(table_name+'.xls') print('导出完成!') else: print('表中无数据,无法导出!') else: print('表不存在!') cur.close() conn.close()

3、方法二:export_table_to_excel.py

(1)定义tools函数模块:

import pymysql,xlwt
import traceback

MYSQL_INFO ={
    'host' :'118.24.3.40',
    'user' :'jxz',
    'password' : '123456',
    'db' : 'jxz',
    'charset':'utf8',
    'port' : '3306',
    'autocommit':True
}

def execute_sql(sql):
    conn =pymysql.connect(**MYSQL_INFO) # XX=XXX,XX=XX
    cur =conn.cursor(pymysql.cursors.DictCursor)
    try:
        cur.execute(sql)
    except:
        print('sql不正确')
        traceback.print_exc()
    else:
        return  cur.fetchall() # None []
    finally:
        conn.close()
        cur.close()

def write_excel(name,data):
    book = xlwt.Workbook()
    sheet = book.add_sheet('sheet1')
    for index, key in enumerate(data[0]):  # 写表头
        sheet.write(0, index, key)
    for row, item in enumerate(data, 1):  # 写数据
        for col, value in enumerate(item.values()):
            sheet.write(row, col, value)
    book.save(name + '.xls')

(2)引用tools函数模块:

import tools
def main():
    table_name = input('请输入你要导出的表名:').strip()
    table_exist_sql = "SELECT table_name FROM information_schema.TABLES WHERE table_name ='%s';" % table_name
    if tools.execute_sql(table_exist_sql):
        query_sql = 'select * from %s;' % table_name
        data = tools.execute_sql(query_sql)
        if data:
            tools.write_excel(table_name,data)
            print('导出完成!')
        else:
            print('表中无数据,无法导出!')
    else:
        print('表不存在!')

if __name__ == '__main__':
    main()

七、改写商品管理的程序,改为从数据库里面取数据

1、方法一:商品管理:product_simple.py

import json
import tools
# 定义读取商品函数
def read_products():
    sql = 'select * from tmz_product_xzh;'
    data = tools.execute_sql(sql)   # [{'id':1,'product_name':'XXX','count':XX,'price':XX}]
    d = {}
    for item in data:
        name = item.get('product_name')
        count = item.get('count')
        price = float(item.get('price'))
        d[name]={'count':count,'price':price}
    return d

# 定义写入商品函数
def write_products(data):
    truncate_sql ='truncate table tmz_product_xzh'
    tools.execute_sql(truncate_sql)
    for k,value in data.items():
        count = value.get('count')
        price = value.get('price')
        insert_sql = 'insert into tmz_product_xzh(product_name,count,price) VALUES ("%s",%s,%s);'%(k,count,price)
        tools.execute_sql(insert_sql)

# 定义数量函数
def is_digit(number):
    s = str(number)
    if s.isdigit():
        if int(s) > 0:
            return True

# 定义价格函数
def is_price(price):   # >0的整数和小数都可以
    s = str(price)
    if is_digit(s):
            return True
    else:
        if s.count('.') == 1:    #1.3
            left,right = s.split('.')
            if left.isdigit() and right.isdigit(): # 正整数 0.0
                if float(s) > 0:
                    return True
# 定义查看商品函数
def show_product():
    # 第一种先读取商品文件信息,然后输入商品名称,接下来作判断
    # products = read_products()
    # product_name = input('请输入商品名称:').strip()
    # if not product_name:
    #     print('请输入商品名称:')
    # elif product_name == 'all':
    #     print(products)
    # elif product_name not in products:
    #     print('商品不存在!')
    # else:
    #     product = products.get(product_name)
    #     print('商品信息:',product)
    # 第二种先输入商品名称,然后读取文件,接下来进行判断(推荐使用)
    product_name = input('请输入商品名称:').strip
    if product_name:
        products = read_products()
        if product_name == 'all':
            print(products)
        elif product_name not in products:
            print('商品不存在!')
        else:
            product = products.get(product_name)
            print('商品信息:',product)
    else:
        print('不能为空!')

# 定义新增商品函数
def add_product():
        product_name = input('请输入商品名称:').strip()
        price = input('请输入商品价格').strip()
        count = input('请输入商品数量:').strip()
        if product_name and price and count:
            if is_price(price) and is_digit(count):
                products = read_products()
                if product_name not in products:
                    products[product_name] = {"count":count,"price":price}
                    write_products(products)
                    print('商品新增成功!')
                else:
                    print('商品已经存在!')
            else:
                print('价格/数量不合法!')
        else:
            print('不能为空!')

# 定义修改商品函数
def modify_product():
    product_name = input('请输入商品名称:').strip()
    price = input('请输入商品价格').strip()
    count = input('请输入商品数量:').strip()
    if product_name and price and count:
        if is_price(price) and is_digit(count):
            products = read_products()
            if product_name in products:
                products[product_name] = {"count": count, "price": price}
                write_products(products)
                print('商品修改成功!')
            else:
                print('商品不存在')
        else:
            print('价格/数量不合法!')
    else:
        print('不能为空!')

# 定义删除商品函数
def del_product():
    product_name = input('请输入商品名称:').strip()
    if product_name:
        products = read_products()
        if product_name not in products:
            print('商品不存在!')
        else:
            products.pop(product_name)
            write_products(products)
    else:
        print('不能为空!')
# 商品管理
choice = input('1、查看商品 2、新增商品 3、修改商品 4、删除商品')
func_map = {'1': show_product(), '2': add_product(),'3': modify_product(),'4':del_product()}
if choice in func_map:
    func_map[choice]
else:
    print('请输入正确的选项!')

2、方法二:product_gooduse.py

import tools

#获取单个商品信息的函数
def get_single_product(name):
    sql = 'select * from tmz_product_xzh where product_name = "%s";' % name
    return tools.execute_sql(sql)

# 定义数量函数
def is_digit(number):
    s = str(number)
    if s.isdigit():
        if int(s) > 0:
            return True

# 定义价格函数
def is_price(price):   # >0的整数和小数都可以
    s = str(price)
    if is_digit(s):
            return True
    else:
        if s.count('.') == 1:    #1.3
            left,right = s.split('.')
            if left.isdigit() and right.isdigit(): # 正整数 0.0
                if float(s) > 0:
                    return True
# 定义查看商品函数
def show_product():
    product_name = input('请输入商品名称:').strip()
    if product_name:
        if product_name == 'all':
            sql = 'select* from tmz_product_xzh;'
            print(tools.execute_sql(sql))
        else:
            product = get_single_product(product_name)
            if product:
                print('商品信息:',product)
            else:
                print('您输入的商品不存在!')
    else:
        print('不能为空!')

# 定义新增商品函数
def add_product():
        product_name = input('请输入商品名称:').strip()
        price = input('请输入商品价格:').strip()
        count = input('请输入商品数量:').strip()
        if product_name and price and count:
            if is_price(price) and is_digit(count):
                if get_single_product(product_name):
                    print('商品已经存在!')
                else:
                    insert_sql = 'insert into tmz_product_xzh(product_name,count,price)'
                                'VALUES ("%s",%s,%s);' % (product_name,count,price)
                    tools.execute_sql(insert_sql)
                    print('商品新增成功!')
            else:
                print('价格/数量不合法!')
        else:
            print('不能为空!')

# 定义修改商品函数
def modify_product():
    product_name = input('请输入商品名称:').strip()
    price = input('请输入商品价格:').strip()
    count = input('请输入商品数量:').strip()
    if product_name and price and count:
        if is_price(price) and is_digit(count):
            if get_single_product(product_name):
                sql = 'update tmz_product_xzh set price=%s,count=%s where product_name="%s";' %(
                    price,count,product_name
                )
                tools.execute_sql(sql)
                print('商品修改成功!')
            else:
                print('商品不存在!')

        else:
            print('价格/数量不合法!')
    else:
        print('不能为空!')

# 定义删除商品函数
def del_product():
    product_name = input('请输入商品名称:').strip()
    if product_name:
        if get_single_product(product_name):
            sql= 'delete from tmz_product_xzh where product_name = "%s";' %product_name
            tools.execute_sql(sql)
            print('商品已删除!')
        else:
            print('商品不存在!')
    else:
        print('不能为空!')
# 商品管理
choice = input('1、查看商品 2、新增商品 3、修改商品 4、删除商品')
func_map = {'1': show_product, '2': add_product,'3': modify_product,'4':del_product}
if choice in func_map:
    func_map[choice]()
else:
    print('请输入正确的选项!')

八、写一个下载QQ群成员的QQ头像程序,传入一个群号,把这个群里所有人的qq头像下载到本地,如果这个人有群备注,那么图片的名称就是刘海洋.jpg如果没有就取昵称:

1、编写程序分析:

2、代码如下:download_imag_to_local.py

# 写一个程序,传入一个群号,把这个群里所有的人的QQ头像下载到本地
# 获取群成员信息接口:https://qun.qq.com/cgi-bin/qun_mgr/search_group_members
# 调用接口:search_group_members(Nick昵称,card群备注)
# 如果A同学有群备注,那么图片的名称就是:Bob.jpg
# 如果A同学没有群备注,那么图片名称就是:28.jpg
# Form Data
# gc: 1078641913
# st: 0
# end: 20
# sort: 0
# bkn: 73612145
# cookie: pgv_pvi=328774656; RK=Bqzk3YEWb+; ptcz=4c3263932d8d5a48b929cd2283f1bde3146c1ee5c4f104796f0c8d95df45c3c8; tvfe_boss_uuid=7d887b37fe60ad85; pgv_pvid=3957380448; pgv_info=ssid=s6095095448; _qpsvr_localtk=0.3003351169111208; p_uin=o1270894070; traceid=830f93d7d9; pgv_si=s2666891264; enc_uin=LqUhmq_so7tn_55OuYQ1UA; uin=o1270894070; skey=@zAKP7lF3z; pt4_token=mxrCcJXWkoh7OkmQxzKPcGAN1wqDHNqMK0hrIJnXZhw_; p_skey=amB*w3nrfpXGRncsrH-elBWWaLZ4w4rFlYsjF0rwo2I_
# 头像下载地址:https://q4.qlogo.cn/g?b=qq&nk=XXXXXXXXX=140
import requests,os

# 判断该文件夹是否存在,不存在自动创建
if not os.path.exists('qq_pics'):
    os.mkdir('qq_pics')

# 进入创建的文件夹里面:
os.chdir('qq_pics')

max_count = 1000
gc = 1078641913
bkn = 73612145
# 获取群信息
group_member_url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
size = 40
cookie = 'pgv_pvi=328774656; RK=Bqzk3YEWb+; ptcz=4c3263932d8d5a48b929cd2283f1bde3146c1ee5c4f104796f0c8d95df45c3c8; tvfe_boss_uuid=7d887b37fe60ad85; pgv_pvid=3957380448; pgv_info=ssid=s6095095448; _qpsvr_localtk=0.3003351169111208; p_uin=o1270894070; traceid=830f93d7d9; pgv_si=s2666891264; enc_uin=LqUhmq_so7tn_55OuYQ1UA; uin=o1270894070; skey=@zAKP7lF3z; pt4_token=mxrCcJXWkoh7OkmQxzKPcGAN1wqDHNqMK0hrIJnXZhw_; p_skey=amB*w3nrfpXGRncsrH-elBWWaLZ4w4rFlYsjF0rwo2I_'
count = 0
for j in range(0,max_count+1,size): # 0,20,3
    # 0,20 21,41 42,62 63,83 84,104
    # 0,20 20,40 40,60 60,80 80,100
    data = {'gc':gc,'st':j+count,'end':j+size+count,'bkn':bkn}
    headers = {'cookie':cookie}
    r = requests.post(group_member_url,data,headers=headers)
    members = r.json()
    count +=1
    if 'mems' in members:
        # QQ图片下载的url地址
        pic_url= 'https://q4.qlogo.cn/g?b=qq&nk=%s&s=140'
        # 获取成员信息(列表格式)
        mems = members.get('mems')
        for m in mems:
            qq = m.get('uin')
            # 使用三元表达式:若取到了card就用card名称,取不到就取nick名称
            name = m.get('card') if m.get('card') else m.get('nick')
            r = requests.get(pic_url % qq)
            with open(name + '.jpg','wb') as fw:
                fw.write(r.content)
            # 下载qq头像
            print('下载完成 %s'%name)
    else:
         print('没有获取到群成员信息!')
         break

九、写两个接口(登录接口和支付接口)

1、编写程序分析:

2、代码如下:

(1)tools.py

import hashlib

import pymysql,xlwt
import traceback

import redis

MYSQL_INFO ={
    'host' :'118.24.3.40',
    'user' :'jxz',
    'password' : '123456',
    'db' : 'jxz',
    'charset':'utf8',
    'port' : 3306,
    'autocommit':True
}

REDIS_INFO = {
    'host':'118.24.3.40',
    'password':'HK139bc&*',
    'db':0,
    'port':6379,
    'decode_responses':True
}

def execute_sql(sql,more=False):
    conn =pymysql.connect(**MYSQL_INFO) # XX=XXX,XX=XX
    cur =conn.cursor(pymysql.cursors.DictCursor)
    try:
        cur.execute(sql)
    except:
        print('sql不正确')
        traceback.print_exc()
    else:
        if more:
            return  cur.fetchall() # None [{}]
        return cur.fetchone()      # {‘XX’:'XX'}
    finally:
        conn.close()
        cur.close()

def write_excel(name,data):
    book = xlwt.Workbook()
    sheet = book.add_sheet('sheet1')
    for index, key in enumerate(data[0]):  # 写表头
        sheet.write(0, index, key)
    for row, item in enumerate(data, 1):  # 写数据
        for col, value in enumerate(item.values()):
            sheet.write(row, col, value)
    book.save(name + '.xls')

def my_md5(s):
    s = str(s)
    s = s.encode()
    m = hashlib.md5(s)
    result = m.hexdigest()
    return result

def redis_str(key,value=False,expire_time=None):
    r = redis.Redis(**REDIS_INFO)
    if value:
        r.set(key,value,expire_time)
    else:
        return r.get(key)

def redis_hash():
    pass

def check_session(session_id):
    result = redis_str(session_id)
    if result:
        return result
    return False

(2)login_and_pay.py

import flask
import tools
import json
import time
import uuid
server = flask.Flask(__name__)

# 登录接口
@server.route('/api/login',methods=['post','get'])
def login():
    username = flask.request.values.get('username','')
    password = flask.request.values.get('password','')
    if username.strip() and password.strip():
        p = tools.my_md5(password)
        query_sql = 'select * from app_myuser where username="%s" and password ="%s";'%(username,p)
        user_result = tools.execute_sql(query_sql)
        if user_result:
            session_str = '%s%s%s'%(username,time.time(),uuid.uuid4())
            session_id = tools.my_md5(session_str)
            user_id = user_result.get('id')
            user_result.get('username')
            tools.redis_str(session_id,'{"userid":%s,"username":"%s"}' % (user_id,username) ,600)
            return json.dumps({'code':'0','msg':'登录成功!','sessionid':session_id},ensure_ascii=False)
        else:
            return json.dumps({'code':'-1','msg':'输入的用户名/密码错误!'})
    else:
        return json.dumps({'code':'-1','msg':'不能为空!'})

# 支付接口
@server.route('/pay',methods=['post','get'])
def pay():
    sessionid = flask.request.values.get('sessionid','')
    money = float(flask.request.values.get('money'))
    session = tools.check_session(sessionid)
    if session:
        user = json.loads(session)
        user_id = user.get('user_id')
        sql = 'select balance from app_myuser where id = %s;' % user_id
        balance = tools.execute_sql(sql).get('balance')
        if balance >= money:
            update_money = 'update app_myuser set balance = balance - %s where id = %s;' %(money,user_id)
            tools.execute_sql(update_money)
            return json.dumps({'code':0, 'msg':'支付成功!'},ensure_ascii=False)
        else:
            return json.dumps({'code':-1, 'msg':'余额不足!'},ensure_ascii=False)
    else:
        return json.dumps({'code': -1, 'msg': '请重新登录!'},ensure_ascii=False)

if __name__=='__main__':
    server.run(host='0.0.0.0',port=8888,debug=True)
温故而知新
原文地址:https://www.cnblogs.com/krystal-xiao/p/13520230.html