一、urllib模块

urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块。

urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出来使用的话,还得用json,发get请求和post请求,也不通,使用比较麻烦

  1. import json
  2. from urllib import request
  3. from urllib import parse
  4.  
  5. #【get请求】
  6. url = 'http://api.nnzhp.cn/api/user/stu_info'
  7.  
  8. data={"stu_name":"xiaohei"}
  9.  
  10. tmpData=parse.urlencode(data) #1、将数据变为k=v模式
  11. print(tmpData)
  12. # 接口+参数
  13. tmpUrl=url+'?'+tmpData # 接口参数拼接
  14. print(tmpUrl)
  15. res = request.urlopen(tmpUrl) # 请求接口
  16. resForRead = res.read() # 通过read安啊获取返回值结果,返回值结果为Bytes类型
  17. print(res.read())
  18. #待b的是bytes类型 bytes类型转成str类型:后面加.decode()
  19.  
  20. resForString = resForRead.decode() # 通过decode将bytes转成str类型
  21. print(resForString)
  22.  
  23. # 2、想得到参数里面某一个字段,要先通过json变成字典的形式,然后再取值
  24. resForDict = json.loads(resForString) # 通过json将字典转成字典
  25. print(resForDict)
  26.  
  27. # 3、必须符合字典的格式才能取值
  28. # 加上[]
  29.  
  30. # 【POST】请求
  31. url = 'http://api.nnzhp.cn/api/user/login'
  32. data={"username":"niuhanyang","passwd":"aA123456"}
  33. tmpData = parse.urlencode(data) # k=v
  34.  
  35. # post 请求写法
  36. res=request.urlopen(url,tmpData.encode()) # post请求 参数1为接口地址;参数2为bytes
  37. print(res.read().decode())
  38. # post和get请求区别在于 urlopen时,get发的是接口和参数的平层字符串
  1. {
  2. "error_code": 0,
  3. "login_info": {
  4. ",
  5. "sign": "65ea3b950abe9aa55f23092449e1da3a",
  6. "userId": 2170
  7. }
  8. }

二、requests模块

需pip install requests导入

  1. pip install requests

Requests 基于 urllib ,采用Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。 目前很多Python 爬虫也使用Requests 库

功能特性

  • Keep-Alive & 连接池
  • 国际化域名和 URL
  • 带持久 Cookie的回话
  • 浏览器式的 SSL 认证
  • 自动内容解码
  • 基本/摘要式的身份认证
  • 优雅的 key/value Cookie
  • 自动解压
  • Unicode 响应体
  • HTTP(s)代理支持
  • 文件分块上传
  • 流下载
  • 连接超时
  • 分块请求
  • 支持 .netrc (用户配置脚本文件)
  1. requests.get() get请求
  2. requests.post() post请求
  3. requests.delete() delete请求
  4. requests.put() put请求

2.1【get请求】

  1. import requests
  2.  
  3. #【get】请求
  4. url = 'http://api.nnzhp.cn/api/user/stu_info'
  5. data={"stu_name":"xiaohei"}
  6.  
  7. res = requests.get(url,data).text
  8. print(res) # 返回的是字符串格式的结果
  9.  
  10. # 1、如果需要返回的是字典格式 后面加.json
  11. res = requests.get(url,data).json()
  12. print(res)

2.2【POST】请求

  1. # 【Post】请求
  2. url = 'http://api.nnzhp.cn/api/user/login'
  3. data={"username":"niuhanyang","passwd":"aA123456"}
  4.  
  5. # res = requests.post(url,data).text
  6. res = requests.post(url,data).json()
  7. print(res)

2.3【入参传json】

  1. # 【入参是json】
  2. url = 'http://api.nnzhp.cn/api/user/add_stu'
  3. data = {"}
  4.  
  5. res = requests.post(url,json=data).json()
  6. print(res) # 接口要求入参是json类型,可以通过在post请求中指定json
  1. {'error_code': 0, 'msg': '操作成功!'}

2.4【充值金币接口】

  1. #【充值金币接口】
  2. # 1、先登录 获取sign
  3. url = 'http://api.nnzhp.cn/api/user/login'
  4. data={"username":"niuhanyang","passwd":"aA123456"}
  5.  
  6. # res = requests.post(url,data).text
  7. res = requests.post(url,data).json()
  8. print(res)
  9.  
  10. # 2、生成cookie
  11. cookie = {"niuhanyang":"160eb8812a08731ca9ce9c1ab6c6bc0f"}
  12. url = 'http://api.nnzhp.cn/api/user/gold_add'
  13. data = {"}
  14. res = requests.post(url,data,cookies=cookie).text #通过cookies传递cookie
  15. print(res)
  1. {
  2. "error_code": 0,
  3. "msg": "操作成功!"
  4. }

2.5【获取header】

  1. url = 'http://api.nnzhp.cn/api/user/all_stu'
  2. header = {"Referer":"http://api.nnzhp.cn/"} # Referer 表示我的请求来自哪里
  1. res = requests.get(url,headers= print(res)

2.5【传入文件】

  1. url = 'http://api.nnzhp.cn/api/file/file_upload'
  2. # 通过files参数将文件传递到服务器上
  3. res = requests.post(url,files={"file":"open('urllib_test.py')"}).text
  4. print(res)
  1. {
  2. "error_code": 0,
  3. "msg": "操作成功!"
  4. }

2.6 jsonpath取响应值

requests小练习

提供一个方法,获取到登陆后的sign

1、请求接口
2、获取返回值
3、解析取sign

安装jsonpath模块

  1. import requests
  2. import jsonpath
  3. import nnlog
  4. log = nnlog.Logger('booke_server.log',backCount=5,level='INFO')
  5.  
  6. def getSign():
  7. url='http://api.nnzhp.cn/api/user/login'
  8. data={"username":"niuhanyang","passwd":"aA123456"}
  9. # res = requests.post(url,data).text
  10. res = requests.post(url,data).json() # 取json格式
  11. log.debug(res)
  12. # sign=res.get('login_info').get('sign')
  13. sign=jsonpath.jsonpath(res,'$..sign') # 需要通过$..来定位
  14. log.info(sign)
  15. print(sign)
  16.  
  17. if __name__ == '__main__':
  18. getSign()

2.7 网络请求

  1. import requests
  2.  
  3. # r = requests.get('url',params={'key':'value'})
  4.  
  5. # r.json() # 用来取参数
  6. # r.text # 用来查看信息
  7.  
  8. r = requests.post(
  9. 'http://www.nnzhp.cn/archives/812',
  10. params={
  11. 'key': 'value'},
  12. data={
  13. 'username': 'xxxx'})
  14. r.json() # 报错,可能返回的不是json格式参数
  15. # raise JSONDecodeError("Expecting value", s, err.value) from None
  16. # json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  17. print(r.text) # 通过r.text查看返回的具体内容
  18.  
  19. # 如果入参的是json格式
  20. 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

  1. import requests
  2.  
  3. url = 'https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'
  4.  
  5. data = {
  6. ',
  7. ',
  8. ',
  9. ',
  10. '}
  11. # 传cookie
  12. 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'}
  13. # https请求加上verify=False就不会报错
  14. r = requests.post(url, data=data, headers=headers, verify=False)
  15. print(r.json())
  1. {'ec': 0, 'svr_time': 1573567113, 'mems': [{'tags': '-1', 'uin':.......

三、 写日志模块

导入 nnlog模块

pip3.5.exe install nnlog

日志级别:(从低到高)

debug

info :重要事件

waring:出现非错误性的异常

error:运行时出现的错误,不需要立刻采取行动,但必须记录下来以备检测。

  1. import nnlog
  2. # log 的路径是一个不存在的文件,会为你主动创建; 参数2 保存5天; Debug是最低级别log
  3. # debug<info
  4. # Warning<error
  5. log = nnlog.Logger('booke_server.log', backCount=5, level='debug', when='S')
  6. log.debug('debug级别')
  1. 2019-11-12 20:22:54,891 - E:/PycharmProjects/mjz/day6/写日志.py[line:6] - DEBUG: debug级别

yagmail 实现发邮件

yagmail 可以更简单的来实现自动发邮件功能。

4.1、安装

  1. 1 pip install yagmail

pip3.5.exe install yagmail

4.2、简单举例

  1. import yagmail
  2.  
  3. username = 'binzi_chen@163.com'
  4. password = '5tgb6yhn'
  5. mail_server = 'smtp.163.com'
  6.  
  7. # 收件人
  8. to = ['binzichen@126.com']
  9. # 抄送
  10. cc = ['475355108@qq.com']
  11.  
  12. # 链接邮箱服务器
  13. yag = yagmail.SMTP(user=username, password=password, host=mail_server)
  14.  
  15. # 邮件标题
  16. subject = 'Hello!'
  17.  
  18. # 邮箱正文
  19. contents = '今天快乐?最近没鱼吃,要注意身体'
  20.  
  21. # 附件
  22. attachments = r'E:\PycharmProjects\mjz\day6\写日志.py'
  23.  
  24. # 发送邮件
  25. yag.send(
  26. to=to,
  27. cc=cc,
  28. subject=subject,
  29. contents=contents,
  30. attachments=attachments)

4.3、给多个用户发送邮件

  1. # 给多人发送邮件
  2. to = ['binzichen@126.com','zibin.chen@mhp.com']

五、新Excel操作

安装 openpyxl模块

pip3.5.exe install openpyxl

5.1 写Excel

  1. import openpyxl
  2.  
  3. book = openpyxl.Workbook()
  4.  
  5. sheet = book.active # 找到默认的sheet页
  6. # sheet1 = book.get_sheet_by_name('sheet1') # 也可以指定sheet表
  7. #
  8. sheet.append(['id', 'username', 'password', 'error_count']) # 插入第一行
  9. sheet.append([1, ', 0]) # 插入第二行
  10. sheet.append([2, 'peo', 324])
  11.  
  12. book.save('user.xlsx')

 可以通过指定单元格输入

  1. import openpyxl
  2.  
  3. book = openpyxl.Workbook()
  4.  
  5. sheet = book.active # 找到默认的sheet页
  6.  
  7. # 指定单元格写
  8. sheet['a1']='userId'
  9. sheet['b1'] = 'userName'
  10. sheet.cell(3,1,') # 指定第3行,第一列
  11. #
  12. book.save('user.xlsx')

5.2 读Excel

  1. import openpyxl
  2.  
  3. book = openpyxl.load_workbook('user.xlsx')
  4.  
  5. sheet = book.active
  6.  
  7. for row in sheet.rows:
  8. for col in row:
  9. print(col.value) # 获取每个单元值
  1. userId
  2. userName
  3. None
  4. None
  5. 1
  6. None

其他方法

  1. print(sheet.cell(1,1).value) # 读取第一行,第一列
  2. print(sheet['a1'].value)
  3. print(list(sheet.rows)) # 获取所有行的数据
  4. print(list(sheet.columns)) # 获取所有列的数据
  5. print(sheet[1:10]) # 读取从第1行到第10行
  6. sheet.delete_cols(1) # 删除第一行
  7. 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)  启动服务,一般都在最后面
  1. import flask
  2. import json
  3.  
  4. server = flask.Flask(__name__)
  5.  
  6. @server.route('/login')
  7. def login():
  8. d = {'error_code':0,'msg':'登录成功'}
  9. return json.dumps(d,ensure_ascii=False)
  10.  
  11. # 启动服务
  12. server.run(host='192.168.1.14',port=8000,debug=True)
  13. # http://127.0.0.1:8000/ 本地运行
  14. #192.168.1.1:8000/api/login

连接成功

6.2 第二个接口 /api/pay

  1. import flask
  2. import json
  3.  
  4. server = flask.Flask(__name__) # 把这个python文件当做一个服务
  5.  
  6. # 第二个接口
  7. @server.route('/api/pay')
  8. def pay():
  9. d = {'error_code': 1, 'msg': '支付成功'}
  10. return json.dumps(d, ensure_ascii=False)
  11.  
  12. # 启动服务
  13. server.run(host='192.168.1.14', port=8000, debug=True)
  1. {"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的话,用这个

  1. import flask
  2. import json
  3.  
  4. server = flask.Flask(__name__) # 把这个python文件当做一个服务
  5.  
  6. # 第一个接口 /login
  7. @server.route('/api/login', methods=['get']) # methods=['post','get']
  8. def login():
  9. username = flask.request.values.get('username') # 从请求里面获取到参数的
  10. password = flask.request.values.get('password')
  11. # flask.request.is_json #是够请求为json,用这个
  12. flask.request.json.get('') # 入参是json的话,用这个
  13.  
  14. # 启动服务
  15. server.run(host='192.168.1.14', port=8000, debug=True)
  1. {"}

6.4 第四个接口 /api/get_bill

导入 tools模块

  1. import pymysql,hashlib
  2.  
  3. def op_mysql(sql,many=True):
  4. db_info = {',
  5. 'host': '118.24.3.40', 'db': 'jxz', 'port': 3306, 'charset': 'utf8',
  6. 'autocommit': True}
  7. conn = pymysql.connect(**db_info) # 建立连接
  8. cur = conn.cursor(pymysql.cursors.DictCursor) # 游标
  9. cur.execute(sql) # 执行sql语句,insert 、update 、delete
  10. if many:
  11. result = cur.fetchall()
  12. else:
  13. result = cur.fetchone() # {''}
  14. cur.close()
  15. conn.close()
  16. return result
  17.  
  18. def md5(s,salt=''):
  19. new_s = str(s) + salt
  20. m = hashlib.md5(new_s.encode())
  21. return m.hexdigest()

获取数据库信息判断数据库是否存在

其中需通过tools.py模块执行sql语句

  1. import flask
  2. import json
  3. import tools
  4.  
  5. server = flask.Flask(__name__) # 把这个python文件当做一个服务
  6.  
  7. # 第三个接口
  8. @server.route('/api/get_bill')
  9. def get_bill():
  10. table_list = ['app_myuser','czm']
  11. table_name = flask.request.values.get('table_name')
  12. limit = flask.request.values.get('limit',50) # 默认50条
  13. if table_name and table_name in table_list:
  14. sql = 'select * from %s limit %s' %(table_name,limit)
  15. result = tools.op_mysql(sql)
  16. data = {'error_code':0,'msg':'成功','data':result}
  17. else:
  18. data = {'error_code':-1,'msg':'没有权限查询该表'}
  19. return json.dumps(data, ensure_ascii=False)
  20.  
  21. # 启动服务
  22. server.run(host='192.168.1.14', port=8000, debug=True)
  23. # Method Not Allowed
  24. # 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操作的更多相关文章

  1. Python(七) —— mock接口开发

    mock接口开发 接口开发有很多框架,诸如 Django,flask,相比较而言,flask 是轻量级web开发框架,用来开发 mock 接口的不二之选.那你可能会问,什么叫 mock 接口呢?moc ...

  2. python学习笔记(十三)接口开发

    一.开发接口的作用 1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试. 2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息. 二.接 ...

  3. python使用笔记22--mock接口开发

    1.mock接口开发 mock是模拟一个接口的意思 为了不阻止测试,开发一个接口,返回你想要的数据,模拟各种场景 需要安装第三方模块flask,flask是web轻量级开发框架 1.1 flask p ...

  4. mock接口开发——flask模块

    1.mock接口开发: #1.模拟没有开发好的接口,你可以模拟它,,,,,,,需要调用其他系统的接口 #2.给别人提供数据 2.步骤:1.安装pip install flask 2.导入模块--起服务 ...

  5. python学习之flask接口开发,环境变量扩展,网络编程requests

    python基础 flask之mock接口 所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使 ...

  6. python学习笔记:接口开发——PythonWEB框架之Flask

    Flask是一个使用 Python 编写的轻量级 Web 应用框架,安装命令如下 pip install flask 一.服务端接口是怎么开发的? 1.启动一个服务 2.接收到客户端传过来的数据3.登 ...

  7. 【Raspberry Pi】定时运行python程序读温湿度传感器数据&发邮件

    1.定时执行脚本 http://tech.it168.com/a2011/0707/1214/000001214830_all.shtml /sbin/service crond start //启动 ...

  8. python基础之psutil模块和发邮件(smtplib和yagmail)

    除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在PyPI - the Python Package Index上注册,只要找到对应的模块名字,即可用pip安装. 此 ...

  9. python学习笔记:接口开发——flask Demo实例

    举例1,返回当前时间接口 ''' 初始化:所有的Flask都必须创建程序实例, web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 程序实例是Flask的对象,一般情况下用如下方法实 ...

随机推荐

  1. MySQL 5.7.26安装及配置--windows10系统下

    安装过程省略,下载包解压即可 一.配置my.ini在解压目录下,新建一个my.ini [mysql] default-character-set=utf8 [mysqld] port = 3306 b ...

  2. contentType: 'application/json' C#后台怎么处理

    contentType: 'application/json' 的处理如下: $(function () { $.ajax({ 'url': "/Home/Send2SHengPi" ...

  3. python之lambda、filter、map、reduce的用法说明(基于python2)

    python中有一些非常有趣的函数,面试的时候可能会遇到.今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,m ...

  4. 释放mac磁盘空间

    转发自:https://www.jianshu.com/p/722093bc3dea Mac清理磁盘空间主要讲述在Mac上工作清理磁盘空间的小技巧,本节主要讲述作为一名使用Mac开发的iOS工程师,需 ...

  5. 如何在同一行里执行多个linux命令?

    如果前一个命令能够成功执行,那么可以使用"&&"操作符(引号内)来合并多个后续的命令. 举例: cd /my_folder && rm *.jar ...

  6. 管理ceph缓存池

    目录 缓存池简介 缓存池原理 缓存池的工作模式 配置缓存池 1. 创建一个缓存池 2. 设置缓存层 3. 缓存层相关参数说明 4. 测试缓存池 删除缓存池 1. 删除read-only缓存池 2. 删 ...

  7. Appium+python自动化(八)- 初识琵琶女Appium(千呼万唤始出来,犹抱琵琶半遮面)- 下(超详解)

    ​简介 通过上一篇宏哥给各位小伙伴们的引荐,大家移动对这位美女有了深刻的认识,而且她那高超的技艺和婀娜的身姿久久地浮现在你的脑海里,是不是这样呢???不要害羞直接告诉宏哥:是,就对了.宏哥要的就是这个 ...

  8. AppBarLayout折叠时候的阴影

    最近在项目中遇到一个需求,AppBarLayout在完全展开时没有阴影,在完全收缩时展示阴影,这个功能可以通过设置StateListAnimator的轻松的实现. 首先,在res/animator目录 ...

  9. golang --strings 下常用函数api

    1. func Compare(a, b string) int {} 比较返回一个按字典顺序比较两个字符串的整数.如果a == b则结果为0,如果a <b则结果为-1,如果a> b则结果 ...

  10. 华为 鸿蒙系统(HarmonyOS)

    HarmonyOS Ⅰ. 鸿蒙系统简介 鸿蒙系统(HarmonyOS),是第一款基于微内核的全场景分布式OS,是华为自主研发的操作系统.2019年8月9日,鸿蒙系统在华为开发者大会<HDC.20 ...