一.接口开发,有依赖关系的接口开发
1.场景:用户登录后发表文章
用户登录接口代码示例:
import flask,time,json from lib import tools server = flask.Flask(__name__) @server.route(‘/login‘,methods=[‘get‘]) def login(): username = flask.request.values.get(‘username‘) pwd = flask.request.values.get(‘pwd‘) if username == ‘zhouly‘ and pwd==‘123456‘: session_id = tools.my_md5(username+time.strftime(‘%Y%m%d%H%M%S‘)) key = ‘txz_session:%s‘%username tools.op_redis(key,session_id,600) res = {‘session_id‘:session_id,‘error_code‘:0,‘msg‘:‘登录成功‘, ‘login_time‘:time.strftime(‘%Y%m%d%H%M%S‘) } #给用户返回的信息 json_res = json.dumps(res,ensure_ascii=False)#返回结果弄成json res = flask.make_response(json_res) #构造成返回结果的对象 res.set_cookie(key,session_id,3600) #最后的数字是cookie的失效时间。 return res
代码执行结果,用户登录成功,返回cookie值给客户端,在客户端查看cookie内容:
1.在浏览器页面点击页面内容中点击鼠标右键,在弹出的快捷菜单中选择"检查"选项
2.在弹出的页面选择"pplication"菜单查看cookies内容
3.在redis数据库中查看session_id 内容
用户要再执行发布文章操作,要拿客户端的cookie中的session_id与redis数据库中的session_id做匹配,如果是一样的,表示该用户已经登录系统,可以执行发布文章操作.
用户发布文章的代码示例:
@server.route(‘/posts‘) def posts(): cookies = flask.request.cookies #所有的cokies username = ‘‘ # session = ‘‘#定义这两个变量是为了,在没有传cookie的时候用的。 for key,value in cookies.items(): if key.startswith(‘txz_session‘): #判断cookie以txz_session开头的话,取到它 username = key session = value #调用接口的时候用户传过的seesion,从cookie里面取过来的 redis_session = tools.op_redis(username) #从redis里面获取到的的cookie if redis_session == session: #判断传过来的seeion和redis里面的session一样 title = flask.request.values.get(‘title‘)#获取文章标题 conent = flask.request.values.get(‘content‘)#获取文章内容 article_key =‘article:%s‘%title #key都以article开头 tools.op_redis(article_key,conent) #把文章写入redis res = {‘msg‘:‘文章发表成功!‘,‘code‘:0} else: res = {‘msg‘:‘用户未登录!‘,‘code‘:2009} return json.dumps(res,ensure_ascii=False)
在浏览器执行posts接口
二、项目添加环境变量、搭建环境说明
1.添加环境变量
import sys,os
BASE_PATH=sys.path.insert(0,r‘E:\syz\syz-code\day8\new_api‘)#路径前面加r,避免换行符\n
BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#__file__获取当前路径
BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#获取到程序的主目录,将当前路径设置为环境变量,可以在任意程序、任意平台设置,__file__获取当前路径,路径分隔符为/,所以前面要加绝对路径os.path.abspath
2.搭建测试环境
第一次搭建测试环境工作内容:
1、申请服务器资源,有N台服务器,Windows, Linux,Windows,(.net开发的),Linux的跨平台
2、安装依赖软件,
java : tomcat jdk1.7 oracle/mysql redis
python: nginx ,apache,python3 ....
3、获取源代码(编译、打包)
4、导入基础数据(建表、执行sql)
5、修改配置文件
6、启动服务
日常部署工作内容:
1、获取源代码(编译、打包)
2、执行sql(可选)
3、修改配置文件
4、重启服务
三、异常处理
即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现。
异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。
错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。
try语句按照如下方式工作;
- 首先,执行try子句(在关键字try和关键字except之间的语句)
- 如果没有异常发生,忽略except子句,try子句执行后结束。
- 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
- 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的try子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:
except (RuntimeError, TypeError, NameError): pass
代码示例:
first = input(‘请输入除数:‘) second = input(‘请输入被除数:‘) try: first = int(first) second = int(second) res = first/second li = [1,2,3,4] # except ValueError as e: #这个e代表错误信息,如果上面的两行代码出现了 ValueError这个错 # print(e) # print(‘请输入整数‘) # except ZeroDivisionError as e: # print(e) # print(‘除数不能为0‘) except Exception as e: #上面代码出异常的时候走这里, print(e) print(‘出错了‘) else: #没有出错,也不是必须写的 print(‘并没有出错‘)#这个是没有异常的时候走 print(res) finally:#不管出错或者没有出错都会执行它,也不是必须写的。比例:关闭数据库连接的操作会用到 print(‘我是finally‘)
知识点: except与except Exception的区别,except只捕捉某一个异常,except Exception捕捉所有的异常
四、网络编程
1、打开一个网页,把网页内容写入到baidu.html文件
from urllib import request,parse
url = ‘http://www.nnzhp.cn‘
req = request.urlopen(url) #打开一个url,发get请求
content = req.read().decode() #获取返回结果
fw = open(‘baidu.html‘,‘w‘,encoding=‘utf-8‘)
fw.write(content)
2.测试学生信息接口,取接口的返回信息error_code的值进行判断
from urllib import request,parse
import json
url=‘http://api.nnzhp.cn/api/user/stu_info?stu_name=xiaohei‘
req = request.urlopen(url) #打开一个url,发get请求
content = req.read().decode() #获取返回结果
res_dic = json.loads(content) #返回的是json,要把json转成字典
if res_dic.get(‘error_code‘) == 0:
print(‘测试通过‘)
else:
print(‘测试失败‘,res_dic)
3、测试用户登录接口
from urllib import request,parse
url = ‘http://api.nnzhp.cn/api/user/login‘
data = {
‘username‘:‘niuhanyang‘,
‘passwd‘:‘密码‘
} #请求数据
data = parse.urlencode(data) #urlencode,自动给你拼好参数
# xx=xx&xx=11
req = request.urlopen(url,data.encode()) #发post请求
print(req.read().decode())
4、使用requests模块发送get请求
import requests
url=‘http://api.nnzhp.cn/api/user/stu_info‘
data={‘stu_name‘:‘小黑‘}
req=requests.get(url,params=data)
print(req.json())#返回的是字典
print(req.text)#string类型,json串
5、使用requests模块发送post请求,测试用户登录,返回信息
url = ‘http://api.nnzhp.cn/api/user/login‘
data = {‘username‘:‘niuhanyang‘,‘passwd‘:‘密码‘} #请求数据
req = requests.post(url,data) #发送post请求
print(req.json())
6、使用requests模块发送post请求,入参是json类型
import random
phone=random.randint(10000000000,99999999999)
url=‘http://api.nnzhp.cn/api/user/add_stu‘
data = {
"name":"zhouly",
"grade":"天蝎座",
"phone":phone,
"sex":"男",
"age":28,
"addr":"河南省济源市北海大道32号"
}
req = requests.post(url,json=data)
print(req.json())
7、使用requests模块发送post请求,添加cookies
url = ‘http://api.nnzhp.cn/api/user/gold_add‘
data = {‘stu_id‘:468,‘gold‘:10000}
djl = {‘niuhanyang‘:‘337ca4cc825302b3a8791ac7f9dc4bc6‘}
req = requests.post(url,data,cookies=djl)
print(req.json())
8、使用requests模块发送get请求,添加header信息
url = ‘http://api.nnzhp.cn/api/user/all_stu‘
header = {
‘Referer‘:‘http://api.nnzhp.cn/‘
}
req = requests.get(url,headers=header)
print(req.json())
9、上传文件
url= ‘http://api.nnzhp.cn/api/file/file_upload‘
data = {
‘file‘:open(r‘C:\Users\bjniuhanyang\Desktop\图\6bd9026dt935575932465&690.jpg‘,‘rb‘)
}
#图片要用rb方式打开
req= requests.post(url,files=data)
print(req.json())
10、下载文件
url = ‘http://up.mcyt.net/?down/46779.mp3‘
req = requests.get(url)
fw = open(‘aaa.mp3‘,‘wb‘)
fw.write(req.content)
原文地址:https://www.cnblogs.com/zhouly-008/p/9053482.html