• Python自动化学习笔记(八)——接口开发、发送网络请求、发送邮件、写日志


    1.接口开发(flask模块)

    Python自动化学习笔记(七)接口开发部分的内容补充

    1.1参数为json格式:

    flask.request.is_json  #判断参数是否是json格式

    flask.request.json.get('key') #获取参数

    1.2参数为form-data格式

    flask.request.data.get('key') #获取参数

    1.3参数中包含文件,上传文件功能:

    file=flask.request.files.get('file_name')    #获取上传的文件,filename为参数名称

    file.save(path)  #保存文件到指定目录

    1.3一个接口示例

    import json
    import time
    from . import tools
    import flask
    from . import check_session
    from conf import setting
    from conf.setting import log
    import os
    server=flask.Flask(__name__)
    
    @server.route('/api/login',methods=['get','post'])
    def login():
        uname = flask.request.values.get('username')
        pd = flask.request.values.get('passwd')
        sql = 'select * from app_myuser where username="%s"' % uname
        log.debug('登录执行的sql是:%s'%sql)
        res = tools.my_db(sql)
        if res:
            if tools.my_md5(pd) == res.get('passwd'):
                uname_md5 = tools.my_md5(uname + str(time.time()))
                # uname_md5 = tools.my_md5(uname)
                key = 'session:%s' % (uname_md5)
                user_info = {'user_id': res.get('id'), 'user_name': uname}
                r = tools.get_redis()
                log.debug('连接redis成功' )
                log.info('用户:%s登录成功' % uname)
                r.set(key, json.dumps(user_info), setting.SESSION_EXPIRE)
                res = {"code": 0, "msg": "登录成功!", 'session_id': uname_md5,
                       'login_time': time.strftime('%Y-%m-%d %H:%M:%S')}
            else:
                res = {"code": 1, "msg": "密码错误!"}
        else:
            log.warning('用户:%s不存在' %uname)
            res = {'code': 2, "msg": "用户不存在"}
        return json.dumps(res, ensure_ascii=False,indent=4)
    
    @server.route('/api/add_stu',methods=['get','post'])
    def add_stu():
        if flask.request.is_json:
            session_id = flask.request.json.get('session_id')
            stu_name = flask.request.json.get('stu_name')
            phone = flask.request.json.get('phone')
            grade = flask.request.json.get('grade')
            sex = flask.request.json.get('sex','')
            age=flask.request.json.get('age',18)
            gold=flask.request.json.get('gold',1000)
            addr = flask.request.json.get('addr','北京')
            if session_id and stu_name and phone and grade:
                session_tag,data=check_session.check_session(session_id)
                if session_tag:
                    sql = "insert into app_student (name,phone,grade,sex,age,gold,addr)VALUES ('{}','{}','{}','{}','{}','{}','{}')".format(stu_name,phone,grade,sex,age,gold,addr)
                    tools.my_db(sql)
                    res = {"code": 0, "msg": "学生信息添加成功!"}
                else:
                    res=data
            else:
                res={'code':3,'msg':'必填参数未填,请查看接口文档!'}
        else:
            res={'code':5,'msg':'入参必须是json类型的'}
        return json.dumps(res, ensure_ascii=False,indent=4)
    
    @server.route('/api/upload',methods=['get','post'])
    def upload():
        session_id=flask.request.values.get('session_id')
        file=flask.request.files.get('file_name')
        if session_id and file:
            login_tag,data=check_session.check_session(session_id)
            if login_tag:
                new_file_name = '%s_%s'%(int(time.time()),file.filename)
                file.save(os.path.join(setting.UPLOAD_DIR,new_file_name))#保存文件
                res = {"code": 0, "msg": "上传文件成功"}
            else:
                res=data
    
        else:
            res = {'code': 3, 'msg': '必填参数未填,请查看接口文档!'}
        return json.dumps(res, ensure_ascii=False,indent=4)
    接口示例

    2.一个Python项目的目录结构

     

    1. book_server/: 项目名

    2. conf/:存放配置文件

    3. data/:存放sql文件

    4. lib/: 存放项目的所有源代码。

    5. logs/:存放日志文件

    6. uploads/:存放下载的文件

    7. start.py: 程序启动脚本

    8. readme.txt: 项目说明文件。

    3.发送网络请求(requests模块)

    1.1发送请求

    • r=requests.get(url,params=data)   #get请求用params,请求时会把它拼接到url后面
    • r=requests.post(url,json=data)   #发送post请求,入参是json类型
    • r=requests.post(url,data=data,files=files) #发送post请求,入参是form-data类型
    •  requests.get(url,params=data,headers={'cookie':'xxx','content':'xxxx'})  #发送带headers的请求

    1.2接口返回值处理

    • json_dic=res.json()  #返回为json格式,直接转成字典
    • str=res.text      #返回为字符串
    • file_content=res.content  #二进制,下载图片、文件时用,可以直接新建文件再保存内容:with open('a.jpg','wb')as f: f.write(r.content)
    • r.cookies        #请求返回的cookie
    • r.status_code     #状态码

    1.3代码实例

    import requests
    
    #发送get请求
    url='http://127.0.0.1:1234/api/login'
    data={'username':'lyc1','passwd':'111111'}
    # r=requests.request(method='get',url=url,data=data)
    r=requests.get(url,params=data)     #get请求用params,请求时会把它拼接到url后面
    print(r.text)#返回字符串
    # print(r.json())#返回的是字典,接口返回的是json格式才可以转成字典
    
    #发送post请求
    url='http://127.0.0.1:1234/api/add_stu'
    data={
    "session_id":"6ab8785039dcf50fb11c53acc1db7648",
    "stu_name":"测试一下",
    "phone":"13111111111",
    "grade":"天秤座",
    "sex":"",
    "addr":"成都"
    }
    r=requests.post(url,json=data) #发送post请求,入参是json类型
    print(r.text)
    
    #上传下载文件,添加header
    url='http://127.0.0.1:1234/api/upload'
    data={'session_id':'6ab8785039dcf50fb11c53acc1db7648'}
    files={'file_name':open(r'E:lyc_studypythonday8ook_serveruploads1545551778_《天才在左疯子在右》 (1).txt','rb')}
    r=requests.post(url,data=data,files=files) #发送post请求,入参是json类型
    print(r.text)
    
    #添加header
    requests.get(url,params=data,headers={'cookie':'xxx','content':'xxxx'})
    
    #下载文件,拿到r.content,写入一个文件
    url='https://q4.qlogo.cn/g?b=qq&nk=564428155&s=140'
    r=requests.get(url)
    with open('a.jpg','wb')as f:
        f.write(r.content)
    
    r.cookies   #请求返回的cookie
    r.status_code       #状态码

    4.发送邮件(yagmail模块)

    yagmail不能直接pip install yagmail,安装的有bug,附件名称为中文时会乱码

    1.1重点方法

    • m=yagmail.SMTP(user=username,password=password,host=mail_server,smtp_ssl=True) 
    • m.send(to=to,cc=cc,subject=subject,contents=contents,attachments=r'E:xxx.jpg')

    1.2代码示例

    import yagmail
    
    username='xxx@qq.com'  
    password='xxxxxxxx'    #有的邮箱不能直接用密码,需要一个客户端授权码,在邮件设置里一般可以拿到
    mail_server='smtp.qq.com'  #邮箱服务器
    m=yagmail.SMTP(user=username,password=password,host=mail_server,smtp_ssl=True)   #smtp_ssl=False,如果邮箱使用了安全协议,就必须加,QQ邮箱要加
    
    to=['xxx@163.com','xxx@qq.com']
    cc='xx@qq.com'
    #to为收件人list,cc为抄送人list,attachments为附件list,都可以只传入一个字符串
    m.send(to=to,cc=cc,subject='吃饭没',contents='吃了啥',attachments=r'E:lyc_studypythonday8ook_serveruploads1545551790_Desert.jpg')

    5.写日志(nnlog模块)

    nnlog模块灰常好用,强烈安利

    import nnlog
    log=nnlog.Logger('book_server.log',when='S',backCount=5)    #实例化一个log对象,其他Python文件要使用可以直接import这个对象
    #backCount指保留几个日志   #when='S',按秒划分文件,m按分钟,D按天
    
    log.debug('写一条dubug日志')
    log.info('写一条info错误')
    log.warning('写一条warning日志')
    log.error('写一条error日志')
  • 相关阅读:
    互联网与局域网(四)
    Socket介绍(五)
    HttpClient(七)
    TCP协议与HTTP协议区别
    TCP连接的三次握手
    context-param和init-param区别
    【HPU】[1736]老王修马路(二)
    【HPU】[1735]老王修马路(一)
    【HPU】[1734]老王修公园
    【HPU】[1733]神奇的数字9
  • 原文地址:https://www.cnblogs.com/luoyc/p/10215272.html
Copyright © 2020-2023  润新知