python语言(六)mock接口开发、发邮件、写日志、新Excel操作
一、urllib模块
urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块。
urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出来使用的话,还得用json,发get请求和post请求,也不通,使用比较麻烦
import json
from urllib import request
from urllib import parse
#【get请求】
url = 'http://api.nnzhp.cn/api/user/stu_info'
data={"stu_name":"xiaohei"}
tmpData=parse.urlencode(data) #1、将数据变为k=v模式
print(tmpData)
# 接口+参数
tmpUrl=url+'?'+tmpData # 接口参数拼接
print(tmpUrl)
res = request.urlopen(tmpUrl) # 请求接口
resForRead = res.read() # 通过read安啊获取返回值结果,返回值结果为Bytes类型
print(res.read())
#待b的是bytes类型 bytes类型转成str类型:后面加.decode()
resForString = resForRead.decode() # 通过decode将bytes转成str类型
print(resForString)
# 2、想得到参数里面某一个字段,要先通过json变成字典的形式,然后再取值
resForDict = json.loads(resForString) # 通过json将字典转成字典
print(resForDict)
# 3、必须符合字典的格式才能取值
# 加上[]
# 【POST】请求
url = 'http://api.nnzhp.cn/api/user/login'
data={"username":"niuhanyang","passwd":"aA123456"}
tmpData = parse.urlencode(data) # k=v
# post 请求写法
res=request.urlopen(url,tmpData.encode()) # post请求 参数1为接口地址;参数2为bytes
print(res.read().decode())
# post和get请求区别在于 urlopen时,get发的是接口和参数的平层字符串
{
"error_code": 0,
"login_info": {
",
"sign": "65ea3b950abe9aa55f23092449e1da3a",
"userId": 2170
}
}
二、requests模块
需pip install requests导入
pip install requests
Requests 基于 urllib ,采用Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。 目前很多Python 爬虫也使用Requests 库
功能特性
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie的回话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(s)代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持 .netrc (用户配置脚本文件)
requests.get() get请求 requests.post() post请求 requests.delete() delete请求 requests.put() put请求
2.1【get请求】
import requests
#【get】请求
url = 'http://api.nnzhp.cn/api/user/stu_info'
data={"stu_name":"xiaohei"}
res = requests.get(url,data).text
print(res) # 返回的是字符串格式的结果
# 1、如果需要返回的是字典格式 后面加.json
res = requests.get(url,data).json()
print(res)
2.2【POST】请求
# 【Post】请求
url = 'http://api.nnzhp.cn/api/user/login'
data={"username":"niuhanyang","passwd":"aA123456"}
# res = requests.post(url,data).text
res = requests.post(url,data).json()
print(res)
2.3【入参传json】
# 【入参是json】
url = 'http://api.nnzhp.cn/api/user/add_stu'
data = {"}
res = requests.post(url,json=data).json()
print(res) # 接口要求入参是json类型,可以通过在post请求中指定json
{'error_code': 0, 'msg': '操作成功!'}
2.4【充值金币接口】
#【充值金币接口】
# 1、先登录 获取sign
url = 'http://api.nnzhp.cn/api/user/login'
data={"username":"niuhanyang","passwd":"aA123456"}
# res = requests.post(url,data).text
res = requests.post(url,data).json()
print(res)
# 2、生成cookie
cookie = {"niuhanyang":"160eb8812a08731ca9ce9c1ab6c6bc0f"}
url = 'http://api.nnzhp.cn/api/user/gold_add'
data = {"}
res = requests.post(url,data,cookies=cookie).text #通过cookies传递cookie
print(res)
{
"error_code": 0,
"msg": "操作成功!"
}
2.5【获取header】
url = 'http://api.nnzhp.cn/api/user/all_stu'
header = {"Referer":"http://api.nnzhp.cn/"} # Referer 表示我的请求来自哪里
res = requests.get(url,headers= print(res)
2.5【传入文件】
url = 'http://api.nnzhp.cn/api/file/file_upload'
# 通过files参数将文件传递到服务器上
res = requests.post(url,files={"file":"open('urllib_test.py')"}).text
print(res)
{
"error_code": 0,
"msg": "操作成功!"
}
2.6 jsonpath取响应值
requests小练习
提供一个方法,获取到登陆后的sign
1、请求接口
2、获取返回值
3、解析取sign
安装jsonpath模块

import requests
import jsonpath
import nnlog
log = nnlog.Logger('booke_server.log',backCount=5,level='INFO')
def getSign():
url='http://api.nnzhp.cn/api/user/login'
data={"username":"niuhanyang","passwd":"aA123456"}
# res = requests.post(url,data).text
res = requests.post(url,data).json() # 取json格式
log.debug(res)
# sign=res.get('login_info').get('sign')
sign=jsonpath.jsonpath(res,'$..sign') # 需要通过$..来定位
log.info(sign)
print(sign)
if __name__ == '__main__':
getSign()
2.7 网络请求
import requests
# r = requests.get('url',params={'key':'value'})
# r.json() # 用来取参数
# r.text # 用来查看信息
r = requests.post(
'http://www.nnzhp.cn/archives/812',
params={
'key': 'value'},
data={
'username': 'xxxx'})
r.json() # 报错,可能返回的不是json格式参数
# raise JSONDecodeError("Expecting value", s, err.value) from None
# json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
print(r.text) # 通过r.text查看返回的具体内容
# 如果入参的是json格式
r = requests.post('url', json={'key': 'value'})
2.8 获取QQ群接口信息
https://qun.qq.com/cgi-bin/qun_mgr/search_group_members
post请求:需要传form data参数、cookie
import requests
url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
data = {
',
',
',
',
'}
# 传cookie
headers = {'cookie': 'pgv_pvi=1350350848; pgv_pvid=1363765446; tvfe_boss_uuid=43b682b311cc2b92; ts_uid=1928343394; RK=GeRBnIl4Z7; ptcz=e65265ce663abc1a6bb3903ed11b03e1466226104e618f763dab28275ed5594a; ts_refer=xui.ptlogin2.qq.com/cgi-bin/xlogin; _qpsvr_localtk=0.23303905772007627; pgv_si=s2086513664; uin=o0475355108; skey=@0FSTxuqKe; ptisp=cnc; p_uin=o0475355108; pt4_token=1XV3XsZQ3h67xObw-RjAWIuRJ6HV10gBRfI-FhEbKI0_; p_skey=aa90d83NdAXv*Ka8UEDv-pMATNRuWTsOM6MlSgVL4s8_; traceid=8a84116ec3; pgv_info=ssid=s8169433835; ts_last=qun.qq.com/member.html'}
# https请求加上verify=False就不会报错
r = requests.post(url, data=data, headers=headers, verify=False)
print(r.json())
{'ec': 0, 'svr_time': 1573567113, 'mems': [{'tags': '-1', 'uin':.......
三、 写日志模块
导入 nnlog模块
pip3.5.exe install nnlog

日志级别:(从低到高)
debug
info :重要事件
waring:出现非错误性的异常
error:运行时出现的错误,不需要立刻采取行动,但必须记录下来以备检测。
import nnlog
# log 的路径是一个不存在的文件,会为你主动创建; 参数2 保存5天; Debug是最低级别log
# debug<info
# Warning<error
log = nnlog.Logger('booke_server.log', backCount=5, level='debug', when='S')
log.debug('debug级别')
2019-11-12 20:22:54,891 - E:/PycharmProjects/mjz/day6/写日志.py[line:6] - DEBUG: debug级别
yagmail 实现发邮件
yagmail 可以更简单的来实现自动发邮件功能。
4.1、安装
1 pip install yagmail
pip3.5.exe install yagmail

4.2、简单举例
import yagmail
username = 'binzi_chen@163.com'
password = '5tgb6yhn'
mail_server = 'smtp.163.com'
# 收件人
to = ['binzichen@126.com']
# 抄送
cc = ['475355108@qq.com']
# 链接邮箱服务器
yag = yagmail.SMTP(user=username, password=password, host=mail_server)
# 邮件标题
subject = 'Hello!'
# 邮箱正文
contents = '今天快乐?最近没鱼吃,要注意身体'
# 附件
attachments = r'E:\PycharmProjects\mjz\day6\写日志.py'
# 发送邮件
yag.send(
to=to,
cc=cc,
subject=subject,
contents=contents,
attachments=attachments)
4.3、给多个用户发送邮件
# 给多人发送邮件 to = ['binzichen@126.com','zibin.chen@mhp.com']
五、新Excel操作
安装 openpyxl模块
pip3.5.exe install openpyxl

5.1 写Excel
import openpyxl
book = openpyxl.Workbook()
sheet = book.active # 找到默认的sheet页
# sheet1 = book.get_sheet_by_name('sheet1') # 也可以指定sheet表
#
sheet.append(['id', 'username', 'password', 'error_count']) # 插入第一行
sheet.append([1, ', 0]) # 插入第二行
sheet.append([2, 'peo', 324])
book.save('user.xlsx')

可以通过指定单元格输入
import openpyxl
book = openpyxl.Workbook()
sheet = book.active # 找到默认的sheet页
# 指定单元格写
sheet['a1']='userId'
sheet['b1'] = 'userName'
sheet.cell(3,1,') # 指定第3行,第一列
#
book.save('user.xlsx')

5.2 读Excel
import openpyxl
book = openpyxl.load_workbook('user.xlsx')
sheet = book.active
for row in sheet.rows:
for col in row:
print(col.value) # 获取每个单元值
userId userName None None 1 None
其他方法
print(sheet.cell(1,1).value) # 读取第一行,第一列 print(sheet['a1'].value) print(list(sheet.rows)) # 获取所有行的数据 print(list(sheet.columns)) # 获取所有列的数据 print(sheet[1:10]) # 读取从第1行到第10行 sheet.delete_cols(1) # 删除第一行 sheet.delete_rows(1) # 删除第一列
六、Mock 接口开发
1、调用支付接口,可以模拟返回
2、给别人提供数据,这样就不用调用你的数据库
3、flask 是一个web开发框架
首先导入flask模块
pip3.5.exe install flask

6.1 第一个接口 /login
- server = flask.Flask(__name__) 把这个文件当做一个服务
- @server.route('/api/login', methods=['get']) 装置器,把它变成一个接口
- return json.dumps(d, ensure_ascii=False) ensure_ascii=False->返回值有中文的话转成中文
- server.run(host='192.168.1.14', port=8000, debug=True) 启动服务,一般都在最后面
import flask
import json
server = flask.Flask(__name__)
@server.route('/login')
def login():
d = {'error_code':0,'msg':'登录成功'}
return json.dumps(d,ensure_ascii=False)
# 启动服务
server.run(host='192.168.1.14',port=8000,debug=True)
# http://127.0.0.1:8000/ 本地运行
#192.168.1.1:8000/api/login


连接成功
6.2 第二个接口 /api/pay
import flask
import json
server = flask.Flask(__name__) # 把这个python文件当做一个服务
# 第二个接口
@server.route('/api/pay')
def pay():
d = {'error_code': 1, 'msg': '支付成功'}
return json.dumps(d, ensure_ascii=False)
# 启动服务
server.run(host='192.168.1.14', port=8000, debug=True)
{"msg": "支付成功", "error_code": 1}

6.3 第三个接口 /api/login
登录接口。设为get请求 @server.route('/api/login', methods=['get']) # methods=['post','get']
从请求里面获取参数 username = flask.request.values.get('username')
flask.request.json.get('') # 入参是json的话,用这个
import flask
import json
server = flask.Flask(__name__) # 把这个python文件当做一个服务
# 第一个接口 /login
@server.route('/api/login', methods=['get']) # methods=['post','get']
def login():
username = flask.request.values.get('username') # 从请求里面获取到参数的
password = flask.request.values.get('password')
# flask.request.is_json #是够请求为json,用这个
flask.request.json.get('') # 入参是json的话,用这个
# 启动服务
server.run(host='192.168.1.14', port=8000, debug=True)
{"}

6.4 第四个接口 /api/get_bill
导入 tools模块
import pymysql,hashlib
def op_mysql(sql,many=True):
db_info = {',
'host': '118.24.3.40', 'db': 'jxz', 'port': 3306, 'charset': 'utf8',
'autocommit': True}
conn = pymysql.connect(**db_info) # 建立连接
cur = conn.cursor(pymysql.cursors.DictCursor) # 游标
cur.execute(sql) # 执行sql语句,insert 、update 、delete
if many:
result = cur.fetchall()
else:
result = cur.fetchone() # {''}
cur.close()
conn.close()
return result
def md5(s,salt=''):
new_s = str(s) + salt
m = hashlib.md5(new_s.encode())
return m.hexdigest()
获取数据库信息判断数据库是否存在
其中需通过tools.py模块执行sql语句
import flask
import json
import tools
server = flask.Flask(__name__) # 把这个python文件当做一个服务
# 第三个接口
@server.route('/api/get_bill')
def get_bill():
table_list = ['app_myuser','czm']
table_name = flask.request.values.get('table_name')
limit = flask.request.values.get('limit',50) # 默认50条
if table_name and table_name in table_list:
sql = 'select * from %s limit %s' %(table_name,limit)
result = tools.op_mysql(sql)
data = {'error_code':0,'msg':'成功','data':result}
else:
data = {'error_code':-1,'msg':'没有权限查询该表'}
return json.dumps(data, ensure_ascii=False)
# 启动服务
server.run(host='192.168.1.14', port=8000, debug=True)
# Method Not Allowed
# The method is not allowed for the requested URL.
http://192.168.1.14:8000/api/get_bill

http://192.168.1.14:8000/api/get_bill?table_name=app_myuser&limit=2

python语言(六)mock接口开发、发邮件、写日志、新Excel操作的更多相关文章
- Python(七) —— mock接口开发
mock接口开发 接口开发有很多框架,诸如 Django,flask,相比较而言,flask 是轻量级web开发框架,用来开发 mock 接口的不二之选.那你可能会问,什么叫 mock 接口呢?moc ...
- python学习笔记(十三)接口开发
一.开发接口的作用 1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试. 2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息. 二.接 ...
- python使用笔记22--mock接口开发
1.mock接口开发 mock是模拟一个接口的意思 为了不阻止测试,开发一个接口,返回你想要的数据,模拟各种场景 需要安装第三方模块flask,flask是web轻量级开发框架 1.1 flask p ...
- mock接口开发——flask模块
1.mock接口开发: #1.模拟没有开发好的接口,你可以模拟它,,,,,,,需要调用其他系统的接口 #2.给别人提供数据 2.步骤:1.安装pip install flask 2.导入模块--起服务 ...
- python学习之flask接口开发,环境变量扩展,网络编程requests
python基础 flask之mock接口 所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使 ...
- python学习笔记:接口开发——PythonWEB框架之Flask
Flask是一个使用 Python 编写的轻量级 Web 应用框架,安装命令如下 pip install flask 一.服务端接口是怎么开发的? 1.启动一个服务 2.接收到客户端传过来的数据3.登 ...
- 【Raspberry Pi】定时运行python程序读温湿度传感器数据&发邮件
1.定时执行脚本 http://tech.it168.com/a2011/0707/1214/000001214830_all.shtml /sbin/service crond start //启动 ...
- python基础之psutil模块和发邮件(smtplib和yagmail)
除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在PyPI - the Python Package Index上注册,只要找到对应的模块名字,即可用pip安装. 此 ...
- python学习笔记:接口开发——flask Demo实例
举例1,返回当前时间接口 ''' 初始化:所有的Flask都必须创建程序实例, web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 程序实例是Flask的对象,一般情况下用如下方法实 ...
随机推荐
- Visual Studio 调试系列11 远程调试
系列目录 [已更新最新开发文章,点击查看详细] 你可以调试已部署在另一台计算机的 Visual Studio 应用程序. 要进行此操作,可使用 Visual Studio 远程调试器. 01 ...
- 框架之jQuery妙用
1.jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行Ajax交 ...
- 一个网页从输入URL到页面加载完成的过程中都发生了什么事情?
这是一个前端的经典面试题,很多大公司面试时都会被问及,涉及的面也是非常多. 一般会经历以下几个过程: 1.首先,在浏览器地址栏中输入url 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中 ...
- 修咻咻对追光的人、云打印团队的Beta产品测试报告
修咻咻对追光的人.云打印团队的Beta产品测试报告 作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平 ...
- Mybatis设置主键自增
<insert id="insertArea" useGeneratedKeys="true" keyProperty="areaId" ...
- js对数组去重的方法总结-(2019-1)
最近待业在家,系统地学习了一套js的课程.虽然工作时间真的比较长了,但有些东西只局限在知其然而不知其所以然的程度上,有些知识点通过“血和泪”的经验积累下来,也只是记了结果并没有深究,所以每次听完课都有 ...
- springboot指定注解扫描范围
springboot注解扫描范围是由@ComponentScan指定的;默认情况下为启动程序所在目录及其子包; 如果需要指定扫描路径,在启动程序中添加修改 @ComponentScan(basePac ...
- php 使用 wangeditor3 图片上传
就在最近,公司让我写一个后台,其中用到了富文本编辑器.自从这个富文本的出现 我就慢慢的进入了一个坑,起初不知道用什么编辑器好,看了好多好多,最后选择了.这个 wangeditor3.个人认为这个富文本 ...
- SpringMVC重要注解 @ControllerAdvice
@ControllerAdvice,是Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强.让我们先看看@ControllerAdvice的实现: package org.spring ...
- C#自定义消息函数,需要一个TextBox,一个委托,直接上代码;
private delegate void de_OutputMessage(string str); public void OutputMessage(string str) { if (text ...