Python操作Excel, 开发和调用接口,发送邮件

笔记:

上周回顾:
模块:
导入模块的顺序
lyl.py #
def hhh():
pass
name = 'lyl'

a.py
import lyl
import sys
from lyl import hhh
sys.path
lyl.hhh()
hhh()

导入模块的实质:
xxx

redis:
r = redis.Redis(host,port,password,db=1,decode_responses=True)
数据库
内存
每秒支持10W次读写
r.get('xxx')
b'xxxx' .decode()
string
set(key,value,60)
get(key) ==> res
delete(key)
set(key,value)
hash
{
'lyl':{'xxx':'xx'},
'qml':{'xx':'xxx'}

}

hset(stu,lyl,{'xxx':'xxx','x':'xxx})
hset(stu,qml,{'xxx':'xxx','x':'11xxx})
hget(stu,qml)
hgetall(stu)
hdel(stu,lyl)
r.keys()
r.keys('qml*')
r.type(key)
r.flushall()
r.flushdb()

excel:
xlwt
book = xlwt.workbook()
sheet = book.add_sheet('sheet1')
sheet.write(row,col,'abc')
book.save('a.xls')
xlrd
book = xlrd.openWorkbook('a.xls')
sheet = book.sheetbyindex(0)
sheet = book.sheetbyname('sheet1')
sheet.row_values(5)
sheet.col_values(1)
sheet.cell(0,5).value
sheet.nrows
sheet.ncols
xlutils
from xlutils import copy
import xlrd
book = xlrd.openWorkbook('a.xls')
new_book = copy.copy(book)
sheet = new_book.get_sheet(0)
sheet.write(0,0,'sdfsdf')
new_book.save('a.xls')
接口开发:
flask
1、mock
2、给别人提供数据


#图书管理
1、登录接口
username lyl
passwd 12234234
sessionid sfsdsdsfsdf
session:lyl sfsdsdsfsdf 3600

2、添加图书
sessiond sfsdsdsfsdf
3、修改图书
4、删除图书
5、查询图书


1、接口开发
带session的接口
入参是json
上传文件的
添加学生:
session_id 必填
stu_name 必填
sex 默认是男
age 默认20
addr 默认 北京
grade 必填
phone 必填的
gold 默认的都是1000

2、发邮件
3、写日志
4、python来发请求
5、异常处理



接口开发:
import flask
import tools
import json,redis
import random

server = flask.Flask(__name__)
#新建一个服务,把当前这个python文件当做一个服务

ip = '118.24.3.40'
password='HK139bc&*'
r = redis.Redis(host=ip,password=password,port=6379,db=10,
decode_responses=True)#连接redis

@server.route('/login',methods=['get'])
def hello():
uname = flask.request.values.get('username')
pd = flask.request.values.get('passwd')
# sql = 'select * from app_myuser where username="%s"'%uname
# res = tools.my_db(sql)
key='nhy:%s'%uname
res = r.get(key)
if res:
res = json.loads(res)
if tools.my_md5(pd) == res.get('passwd'):
res = {"code":0,"msg":"登录成功!"}
else:
res = {"code":1,"msg":"密码错误!"}
else:
res = {'code':2,"msg":"用户不存在"}
return json.dumps(res,ensure_ascii=False,indent=4)
@server.route('/reg',methods=['post'])
def reg():
uname = flask.request.values.get('username')
pd = flask.request.values.get('passwd')
cpd = flask.request.values.get('cpwd')
key='nhy:%s'%uname
res = r.get(key)
if res:
res = {'code': 2, "msg": "用户已存在"}
else:
md5_password = tools.my_md5(pd)
res = {'id':random.randint(100,9999),'username':uname,'passwd':md5_password,'is_admin':1}
r.set('nhy:%s'%uname,json.dumps(res))#
res = {"code":0,"msg":"注册成功!"}
return json.dumps(res,ensure_ascii=False,indent=4)

@server.route('/api/stu')
def get_stu():
username = flask.request.values.get('name')#默认get不到的话,返回的值就是None
age = flask.request.values.get('age')
if username and age:
sql = "select * from app_student where name='%s' and age='%s'" % (username, age)
elif not username and age:
sql = "select * from app_student where age='%s'" % age
elif username and not age:
sql = "select * from app_student where name='%s'" % username
else:
sql = "select * from app_student"
res = tools.my_db2(sql)
return json.dumps(res,ensure_ascii=False,indent=4)

server.run(host='0.0.0.0',port=8999,debug=True)
#ip:8000/login
#127.0.0.1
上周作业:
#1、传入一个表名,然后把表里的数据导出到excel里面

#1、写excel xlwt
#2、连接数据库 pymysql

#1、连接上数据库,写好 sql ='select * from %s;'%table_name
#2、获取到数据 [[id name passwd is_admin] [1,nhy,xdfsdfsd,1],[2,nhy2,xdfsdfsd,1] ]
#3、循环写入excel
#4、写表头 hhh
# import pymysql,xlwt
# conn = pymysql.connect(host='118.24.3.40',user='jxz',password='123456',db='jxz')
# cur = conn.cursor()
# table_name = input('请输入你要导出的表名:').strip()
# cur.execute('select * from %s;'%table_name)
# res = list(cur.fetchall())
# fields = [ field[0] for field in cur.description ]
# # cur.description获取到表结构
# res.insert(0,fields)
# book = xlwt.Workbook()
# sheet = book.add_sheet('sheet1')
# for index,value in enumerate(res):
# for index2,v2 in enumerate(value):
# sheet.write(index,index2,v2)
# book.save('%s.xls'%table_name)
# cur.close()
# conn.close()

#1、获取到数据库里面的数据
# {'username':'lyl','password':xxx,'id':111,'addr':'xxx'}
#2、存到redis里面
# set(lyl,{'username':'lyl','password':xxx,'id':111,'addr':'xxx'})
#get(key)

# import pymysql,redis,json
# conn = pymysql.connect(host='118.24.3.40',user='jxz',password='123456',db='jxz')
# cur = conn.cursor(pymysql.cursors.DictCursor)
# cur.execute('select * from app_myuser;')
# data = cur.fetchall()
# cur.close()
# conn.close()
# ip = '118.24.3.40'
# password='HK139bc&*'
# r = redis.Redis(host=ip,password=password,port=6379,db=10,
# decode_responses=True)#连接redis
# for d in data:
# # {'username':'lyl','password':xxx,'id':111,'addr':'xxx'}
# key = 'nhy:%s'%d.get("username")
# r.set(key,json.dumps(d))



# fw = open('a.txt','w',encoding='utf-8')
# fw.write('时代峰峻圣诞节疯狂楼上的房间考虑到双方就上课了的房间开连锁店是的范德萨')
# fw = open('b.txt','w',encoding='gbk')
# fw.write('时代峰峻圣诞节疯狂楼上的房间考虑到双方就上课了的房间开连锁店是的范德萨')
# import chardet
# f= open('b.txt','rb')
# res = f.read()
# print(chardet.detect(res))
# print(res.decode('gbk'))
#python utf-8 gbk GB2312字符集
#1121 牛

发送邮件:
import yagmail
username='[email protected]'
password='houyafan123'#生成授权码,qq、163、126都是授权码

mail_server = 'smtp.163.com'
# mail_server = 'smtp.qq.com'
# mail_server = 'smtp.126.com'

m = yagmail.SMTP(user=username,password=password,host=mail_server)
# smtp_ssl=True,如果邮箱使用了安全协议,就需要加这个
#qq邮箱就是使用了安全协议

to = ['[email protected]','[email protected]','[email protected]']
cc = ['[email protected]','[email protected]','[email protected]']

m.send(to=to,cc=cc,subject='今天吃了吗',
contents='今天吃鱼肉了吗,吃饱没',
attachments=r'tools.py')

发送网络请求:
# from urllib.request import urlopen
# from urllib.parse import urlencode
#
# # url='http://127.0.0.1:8999/api/login?username=testuser1&passwd=111111'
# # res = urlopen(url).read()
# # print(res.decode())
# url='http://127.0.0.1:8999/api/login'
# data = {'username':'testuser1','passwd':'111111'}
# s = urlencode(data)
# res = urlopen(url,s.encode()) #post请求
# print(res.read().decode())

import requests
import random
url='http://127.0.0.1:8999/api/upload'
# data = {'username':'testuser1','passwd':'111111'}
# r = requests.get(url,params=data) #发get请求
# r = requests.post(url,data=data) #发post请求

# data = {
# "session_id":"6ab8785039dcf50fb11c53acc1db7648",
# "name":"zhouyongbo%s"%random.randint(1,99),
# "phone":"111211345%02d"%random.randint(1,99),
# "grade":"天秤座"
# }
# #
# r = requests.post(url,json=data) #入参是json类型的

#上传文件的
# r = requests.post(url,
# data={'session_id':'6ab8785039dcf50fb11c53acc1db7648'},
# files={'file_name':open('account.xls','rb') }
# )

# requests.get(url,headers={'cookie':'pt2gguin=o0511402865; RK=JQZpwBp1by; ptcz=6c30e26a9ed6be93d3de9e4c4aca3e55650cf99fcffa64729bd1d58a5fb209d9; pgv_pvi=779236352; pgv_pvid=6970909788; qb_qua=; qb_guid=818de686e29d412fa4ee9e99905ea166; Q-H5-GUID=818de686e29d412fa4ee9e99905ea166; NetType=; pgv_si=s4499960832; FTN5K=0138ca95; pgv_info=ssid=s4269564370; luin=o0511402865; uin=o0511402865; lskey=00010000efc2701412d3429029ac9366e4ba98f0e978e0ae4a9c684101a7b22df0695f534bc242c8d4ff386d; skey=@0sHtvhTsD; ptisp=cnc; p_uin=o0511402865; pt4_token=wGU2YAaM0uu7LbcNjuDcLN-TPrEy7AZw4gcL5TEcKxw_; p_skey=1zg7yvF5wr6l43mfr-BvNHxuVDtybKpR5RbCrgC8weQ_'})


# requests.get(url,cookies={'pt2ggui':'o0511402865','RK':'JQZpwBp1by'})
# print(r.text) #结果返回的就是字符串
# print(r.json()) #结果返回的就是字典,必须返回的是json,才能转成字典

#下载文件、上传文件、添加header

#下载文件
# url='https://q4.qlogo.cn/g?b=qq&nk=1834364415&s=140'

# url='https://qiniuuwmp3.changba.com/1127063572.mp4'
r = requests.get(url)
#返回的就是二进制的
r.cookies #返回cookie
r.status_code #返回的状态码200


f = open('sdfsdf.mp4','wb')
f.write(r.content)
f.close()

写日志:
import nnlog
nnlog.Logger.words='哈哈哈哈'

log = nnlog.Logger('book_server.log')

# debug
# info
# warning
# error
log.surprise()
log.debug('xxx值是什么')
log.info('调用了什么xxx')
log.warning('xx警告!')
log.error('xxx出错!')
tools.py
import time
import os
def timestampToStr(timestamp=None,format='%Y-%m-%d %H:%M:%S'):
#时间戳转格式化好的时间
if timestamp:
time1 = time.localtime(timestamp)
res = time.strftime(format, time1)
else:
res = time.strftime(format)
return res
#20180304153958
def strTotimestamp(str=None,format='%Y%m%d%H%M%S'):
#格式化的时间转时间戳
if str:
timep = time.strptime(str, format)
res = time.mktime(timep)
else:
res = time.time()
return int(res)

def clean_log(path,day=3):
print('调用了')
for cur_path, dirs, files in os.walk(path):
for file in files:
if file.endswith('log'):
f_time = file.split('.')[0].split('_')[-1]
file_timestamp = strTotimestamp(f_time,'%Y-%m-%d')
cur_timestamp = strTotimestamp(time.strftime('%Y-%m-%d'),'%Y-%m-%d')
if (cur_timestamp - file_timestamp) >= 60*60*24*day:#判断文件的时间是否大于3天
os.remove(os.path.join(cur_path,file))


import pymysql
def my_db(sql):
conn = pymysql.connect(host='118.24.3.40',user='jxz',password='123456',
db='jxz',port=3306,charset='utf8',autocommit=True)
cur = conn.cursor(pymysql.cursors.DictCursor)
cur.execute(sql)
res = cur.fetchone() #{'username':'nhy'} {}
cur.close()
conn.close()
return res

def my_db2(sql):
conn = pymysql.connect(host='118.24.3.40',user='jxz',password='123456',
db='jxz',port=3306,charset='utf8',autocommit=True)
cur = conn.cursor(pymysql.cursors.DictCursor)
cur.execute(sql)
res = cur.fetchall() #{'username':'nhy'} {}
cur.close()
conn.close()
return res

import hashlib
def my_md5(s,salt=''):
s = s+salt
news = str(s).encode()
m = hashlib.md5(news)
return m.hexdigest()
if __name__ == '__main__':
#判断如果是在别的文件里面导入这个python文件的话,就不执行下面的代码
print(strTotimestamp())
print(clean_log('.'))
print(clean_log('.',2))

setting.py:

import os
import nnlog
REDIS_INFO = {
'host':'118.24.3.40',
'port':6379,
'password':'HK139bc&*',
'db':10,
'decode_responses':True
}


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

SESSION_EXPIRE = 60*60*1 #session过期时间


SERVER_INFO = {
'debug':True,
'port':8999,#启动咱们服务的端口
'host':'0.0.0.0'

}
# __file__ 代表的就是当前这个python文件
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)
))#取到程序的主目录

UPLOAD_DIR = os.path.join(BASE_PATH,'uploads')#上传文件的路径
LOG_FILE = os.path.join(BASE_PATH,'logs','server.log')#日志文件存放的路径

log = nnlog.Logger(LOG_FILE,level='warn') #实例化好

init.sql
CREATE database book_server charset utf8;
CREATE table book(
id int,
book_name VARCHAR(20) not null,
price FLOAT
);

check_session.py
from . import tools
import json
def check_session(session_id):
session_tag = False #SESSION是否失效的标识
r = tools.get_redis()
res = r.get('session:'+session_id)
if res:
session_tag = True
data = json.loads(res)
else:
data = {'code':4,'msg':'请登录!'}
return session_tag,data

server.py
import json
import os

from . import tools
from .check_session import check_session
# import tools

from conf import setting
from conf.setting import log
import flask
import time
server = flask.Flask(__name__)


@server.route('/api/login',methods=['get','post'])
def login():
uname = flask.request.values.get('username')
pd = flask.request.values.get('passwd')
sql = 'select * from app_myuser where username="%s"'%uname
log.debug('登录执行的sql是:%s'%sql)
res = tools.my_db(sql)
if res:
if tools.my_md5(pd) == res.get('passwd'):
uname_md5 = tools.my_md5(uname+str(time.time()))
# uname_md5 = tools.my_md5(uname)
key='session:%s'%(uname_md5)
user_info = {'user_id':res.get('id'),'user_name':uname}
r = tools.get_redis()
log.debug('连接redis成功')
r.set(key,json.dumps(user_info),setting.SESSION_EXPIRE)
res = {"code":0,"msg":"登录成功!",'session_id':uname_md5,
'login_time':time.strftime('%Y-%m-%d %H:%M:%S')}
log.warning('%s 用户登陆成功'%uname)
else:
res = {"code":1,"msg":"密码错误!"}
else:
log.warning('%s用户不存在'%uname)
res = {'code':2,"msg":"用户不存在"}
return json.dumps(res,ensure_ascii=False)

@server.route('/api/add_stu',methods=['post'])
def add_stu():
if flask.request.is_json:
session_id = flask.request.json.get('session_id')
name= flask.request.json.get('name')
phone = flask.request.json.get('phone')
grade = flask.request.json.get('grade')
addr = flask.request.json.get('addr','北京')
sex = flask.request.json.get('sex','男')
age = flask.request.json.get('age',18)
gold = flask.request.json.get('gold',1000)
if session_id and name and phone and grade:
login_tag , data = check_session(session_id)
if login_tag:
insert_sql="insert into `jxz`.`app_student` ( `name`, `sex`," \
" `age`, `addr`, `grade`, `phone`, `gold`)" \
" values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s');"%(name,sex,age,addr,grade,phone,gold)
tools.my_db(insert_sql)
res = {'code':0,'msg':'学生信息添加成功'}
else:
res = data

else:
res = {'code':3,'msg':'必填参数未填,请查看接口文档!'}
else:
res = {'code':5,'msg':'入参是json类型的!'}
return json.dumps(res, ensure_ascii=False)

@server.route('/api/upload',methods=['post'])
def upload():
session_id = flask.request.values.get('session_id')
file = flask.request.files.get('file_name')
if session_id and file:
login_tag, data = check_session(session_id)
if login_tag:
new_file_name = '%s_%s'%(int(time.time()),file.filename)
#防止文件名重复,所以把文件名前面加上了时间戳
abs_file_path = os.path.join(setting.UPLOAD_DIR,new_file_name)
#拼文件的绝对路径,这样子就放到了uploads目录下
file.save(abs_file_path)#保存文件
res = {'code':0,'msg':'上传文件成功!'}
else:
res = data
else:
res = {'code':3,'msg':'必填参数未填,请查看接口文档!'}
return json.dumps(res, ensure_ascii=False)

tools.py
import pymysql
import hashlib
import redis
from conf import setting
def my_db(sql):
conn = pymysql.connect(**setting.MY_SQL_INFO)
cur = conn.cursor(pymysql.cursors.DictCursor)
cur.execute(sql)
res = cur.fetchone() #{'username':'nhy'} {}
cur.close()
conn.close()
return res

def my_db2(sql):
conn = pymysql.connect(**setting.MY_SQL_INFO)
cur = conn.cursor(pymysql.cursors.DictCursor)
cur.execute(sql)
res = cur.fetchall() #{'username':'nhy'} {}
cur.close()
conn.close()
return res

def my_md5(s,salt=''):
s = s+salt
news = str(s).encode()
m = hashlib.md5(news)
return m.hexdigest()

def get_redis():
r = redis.Redis(**setting.REDIS_INFO)
return r

reade.txt
1、这是一个图书管理系统
接口:
/api/login
username
password

/api/add_book
/api/modify_book
/api/delete_book

依赖:
pymysql
redis
flask

启动:
python start.py

start.py
from lib.server import server
from conf import setting

server.run(**setting.SERVER_INFO)
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/fangfangzhang/p/10166467.html
今日推荐