接口开发、异常处理、网络编程

一.接口开发,有依赖关系的接口开发

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)

 

猜你喜欢

转载自www.cnblogs.com/zhouly-008/p/9053482.html