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

Posted catherine093

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于day8 网络编程 接口开发 异常处理的主要内容,如果未能解决你的问题,请参考以下文章

day8 (异常处理和网络编程)

Python20期课堂总结-20180127day8-异常处理与网络编程

DAY8 - 异常处理,面向对象编程

Python之路,Day8 - 面向对象编程进阶

day8 异常处理

day8 socket socketserver 异常 断言