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

一 、在day7中已经讲了单个接口的开发,今天讲有关系的接口开发,也就是依赖性,比如你要在博客园写文章就必须先登录,登陆之后才能发表文章,那么登陆和发表文章之间就有个依赖关系,要做的就是这种开发:

1.接口开发首先要导入flask,导入我们用的着的方法

截图:__name__这里有必要解释一下,name前后是两个_不要写错

导入方法:

1.如果不嫌麻烦完全可以一级一级目录点出来,

2.也可以手动添加环境变量

3.就是可以用pycharm自动帮我们添加环境变量,右键选择Mark Directory as-->source root,设置后这个new_api就会变色,倒入方法就可以直接from lib import xxx

PS:如果在这个项目中别的目录你设置了环境变量,只能取消设置后再设置你想要的那个目录才可以

4.在python中怎么区分方法和接口,就要用到@server了

解析:括号里第一个参数是路径,比如:127.0.0.1:8989/login,就是标红的这一部分,第二个参数截图中没有,是methods=['post','get'],两个方法都写就是可以用post也可以用get

5.在server下写获取cookie的方法:

 6.在获取cookie后,用户发表文章时,系统会拿浏览器中存的token进行对比,如果一致,就表示用户仍然处于登陆状态,可以发表文章,如果不一致,就要重新登陆了

@server.route('/posts')
def posts():

    # session = flask.request.values.get('session')
    print(flask.request.cookies) #打印cookiee
    cookies = flask.request.cookies
    # for cookie in cookies: #这个是循环cookies这个字典的key
    #     if cookie.startswith('txz_session'):
    #         username = cookie
    #         session = cookies.get(cookie)
    username = ''
    session = ''  #定义这两个变量是为了在没有传cookie的时候用的
    for key,value in cookies.items():
        if key.startswith('txz_session'): #判断session以‘txz_session’开头
            username = key
            session = value   #调用接口的时候用户传来的session
    redis_session = tools.op_redis(username) #从redis中获取到的cookie
    if redis_session==session: #判断传过来的session和redis中的一样
        title = flask.request.values.get('title')
        content = flask.request.values.get('content')
        article_key = 'article:%s'%title
        tools.op_redis(article_key,content) #往redis写数据,把文章写入redis
        res = {'msg':'文章发表成功!','code':0}
    else:
        res = {'msg':'用户未登陆','code':401}
View Code
return json.dumps(res,ensure_ascii=False)

 二、异常处理,拿最简单的例子来说:5/0 =?除数不能为0 ,

res = 5/0
print(res)
运行结果 除数不能为0
Traceback (most recent call last):
  File "G:/catherine/python/day8/异常处理.py", line 1, in <module>
    res = 5/0
ZeroDivisionError: division by zero
import random
# guess = random.randint(10,20)
# num = input('please enter a num:')
# print(num+guess)
#运行后,guess是int类型,num是string类型
# please enter a num:3
# Traceback (most recent call last):
#   File "/G:/catherine/python/day8/异常处理.py", line 11, in <module>
#     print(num+guess)
# TypeError: Can't convert 'int' object to str implicitly

这个时候我们可以对异常具体化, 就要用到try

first = input('请输入被除数')
second = input('请输入除数')
try:
    first = int(first)
    second = int(second)
    res = first/second
# except ValueError as e:  #e代表错误信息,把异常放入e,如果出错走except
#     print(e)
#     print('请输入整数')
# except ZeroDivisionError as e:
#     print(e)
#     print('除数不能为0')
except Exception as e: #捕捉任何异常
    print(e)
    print('wrong')
else:#不出错就走这里
    print('sure')
    print(res)
finally: #不管出错或者没有出错都会执行它,也不是必须写的
    print('我是finally')

三、补充函数【zip,map.filter】

zip,就是把两个list,合并到一起,如果想同时循环n个list的时候,就可以用zip
eg:
# for a,b in zip(l1,l2):
#     print(a,b)

map 帮助循环调用函数

def my(num):
    return  str(num)
lis = [1,2,3,4,5,6,7]
new_lis = []
for i in lis:
    new_lis.append(my(i)) #如果有map就可以不用这样写

res = map(my,lis)
print(res)
运行后
<map object at 0x0000006F84D35C50>
res = list(map(my,lis)) #需要强制转换为list才能看到结果
print(res)

filter 也是循环调用函数,不过是过滤,符合情况的留下,不符合的不会出现

def even(num):
    if num%2==0:
        return True
    return False
res1 = list(map(even,lis)) #map帮助循环调用函数,函数返回什么就保存什么
运行
[False, True, False, True, False, True, False]
res2 = list(filter(even,lis)) #filter只保留返回为真的数据
运行
[2, 4, 6]
print(res1)
print(res2)

三、网络编程  requests   pip install requests

get 请求

def choujiang(userid,sign):
    url = 'http://api.xxxxx.cn/api/product/choice'
    data = {} #请求数据
    data['userid'] =userid
    data['sign'] = sign
    req =requests.get(url,params=data) #发请求
    # print(req.json())#type:dic
    return req.json()

req.json()  类型是dict

req.text 类型是string

post请求

url = 'http://api.xxxxx.cn/api/user/login'
    data = {}
    data['username']=username
    data['passwd'] = pwd
    req = requests.post(url,data)
    # print(req.json())
    try:
        s = req.json()['login_info']['sign']  #获取到sign的值
        uId = req.json()['login_info']['userId']

        # print(s)
        # print(uId)
        return s, uId
    except Exception as e:
        print(e)

3.添加cookie

添加cookie
url = 'http://api.xxxxx.cn/api/user/gold_add'
data = {'stu_id':468,'gold':50}
cookie = {'niuhanyang':'337ca4cc825302b3a8791ac7f9dc4bc6'}
req = requests.post(url,data,cookies =cookie)
print(req.json())

4.添加header

添加header
url = 'http://api.xxxxx.cn/api/user/all_stu'
header = {
    'Referer':'http://api.xxx.cn/'
}
req = requests.get(url,headers = header)
print(req.json())

5.上传文件

上传文件
url = 'http://api.nnzhp.cn/api/file/file_upload'
data = {
    'file':open(r'C:\Users\Litsoft\Desktop\listitem.png','rb')
    # 'file':open('note',encoding='utf-8')
    #文件中有中文要加encoding,如果是图片用‘rb
}
req = requests.post(url,files = data)
print(req.json())

6.下载文件

下载文件
# url = 'http://www.nnzhp.cn/wp-content/uploads/2018/01/soup.jpg'
# url = 'http://www.nnzhp.cn/archives/630'
url = 'http://up.mcyt.net/?down/46779.mp3'
req = requests.get(url)
# print(req.content) #图片是二进制,所以用content
# fw = open('s.jpg','wb') #关于图片,rb是读,wb是写
# fw = open('py.html','wb') #关于html,rb是读,wb是写
fw = open('a.mp3','wb') #关于mp3,rb是读,wb是写
fw.write(req.content)

猜你喜欢

转载自www.cnblogs.com/bzdfxx/p/9052402.html