• python学习之flask接口开发,环境变量扩展,网络编程requests,fastapi接口


    python基础

    flask之mock接口

      所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使用flask模块,它是一个web框架,可以做一个服务使用

    import flask    #web框架模块
    #mock接口 表示虚拟接口
    import datetime
    server = flask.Flask(__name__)#__name__表示把当前这个python文件做成一个服务
    @server.route('/time')#使用装饰器添加接口路径,自动运用下面的方法,默认不写为get请求,post请求添加参数metho=['post']
    def time():
        time_now= str(datetime.datetime.now())
        return time_now
    @server.route('/mypage')#我们开发网站也是一样,我这边写好一个html页面,只要读取页面内容,就可以放在/page的路径下,就可以访问了
    def myhtml():
        r = open('html.html','r',encoding='utf-8')
        res = r.read()
        r.close()
        return res
    server.run(host= '0.0.0.0',port=2333,debug=True)
    #默认端口号5000,host='0.0.0.0'表示在此局域网内用户都可以访问,debug=True表示调试模式,改完代码自动重启服务器
    #get传参
    @server.route('/login')
    def login():#模拟登陆接口,需要参数用户名和密码
        name = flask.request.args.get('username')#获取输入的用户名,args这个方法只能获取url中的参数,不能获取post传参
        passwd = flask.request.args.get('password')#获取输入的密码
        if name and passwd:   #校验用户名和密码是否符合要求
            res = {"error_code":1000,"msg":"登陆成功"}
        else:
            res = {"error_code":3000,"msg":"参数错误,请查看接口文档"}
            res = json.dumps(res,ensure_ascii=False)
       return json.dumps(res,ensure_ascii=False)#把字典转成json串ensure_ascii=False不写如果是中文在页面会显示url编

      

    #post传参
    @server.route('/login',methods=['post'])#post请求只能用测试工具进行请求
    def login():#模拟登陆接口,需要参数用户名和密码
        name = flask.request.values.get('username')#获取输入的用户名,values方法能在url和传参中都能获取到
        passwd = flask.request.values.get('password')#获取输入的密码
        if name and passwd:   #校验用户名和密码是否符合要求
            res = {"error_code":1000,"msg":"登陆成功"}
        else:
            res = {"error_code":3000,"msg":"参数错误,请查看接口文档"}
        return json.dumps(res,ensure_ascii=False)#把字典转成json串ensure_ascii=False不写如果是中文在页面会显示url编码    
    server.run(host= '0.0.0.0',port=2333,debug=True)

       使用postman向接口发起请求,把参数写在参数体中

     

      关于flask web框架感兴趣可以参考    https://www.cnblogs.com/huchong/p/8227606.html#_label6  

                          https://dormousehole.readthedocs.io/en/latest/ 

      接口连接数据库    操作很简单,写一个配置数据库的方法

        name = flask.request.values.get('username')
        passwd = flask.request.values.get('password')
        if name and passwd: 
            sql = "select username,password from mysql_db where username ='%s'and password = '%s'"%(name,passwd)
            sql_res = connect_mysql(sql)#导入mysql的方法
            if sql_res:#如果有值说明匹配成功
                res = {"error_code": 1000, "msg": "登陆成功"}
            else:
                res = {"error_code":2000,"msg":"用户名密码错误,请查看接口文档"}
            return json.dumps(res, ensure_ascii=False)
        else:
            res = {"error_code":3000,"msg":"参数错误,请查看接口文档"}
            res = json.dumps(res,ensure_ascii=False)
            return res

      

      接口传json数据

    #post中json参数请求
    @server.route('/json',methods=['post'])
    def add_student():
        params = flask.request.json#当入参用的是字典,可以通过此方法获取
        if params:
            username = params.get('name')#获取value值,之后该校验校验,该调用调用,如果没有传过来可以给默认值
            password = params.get('pwd')
            res = {"error_code": 200, "msg": "请求成功"}
        else:
            res = {"error_code":3001,"msg":"入参必须为json格式,请查看接口文档"}
        return json.dumps(res,ensure_ascii=False)#字典转json

      接口文件上传

    @server.route('/upload',methods=['post'])
    #文件上传
    def upload():
        file = flask.request.files.get('file_name',None)#上传文件,None表示不是必传的
        if file:
            res = {"error_code":200,"msg":"上传成功"}#后期还可以做文件名称根据时间来拼接,避免上传同两份一样的文件被覆盖
        else:
            res = {"error_code": 3000, "msg": "没有上传成功"}
        return json.dumps(res,ensure_ascii=False)
    server.run(host= '0.0.0.0',port=2333,debug=True)

    环境变量扩展

      当项目包装好之后,要想在任何一个电脑都可以运行python项目,就必须把运行文件加入python的环境变量,在文件下加入下面代码

    import os,sys
    res = os.path.abspath(__file__) #取当前文件的绝对路径
    base_path = os.path.dirname(os.path.dirname(res))#取父目录,也就是文件包根目录,我这边只有两层
    sys.path.insert(0,base_path)#加入环境变量 

    初入网络编程

      所谓网络编程就是python操作网络,我们可以通过get和post进行传参,文件上传,文件下载等操作

    urllib模块  是python的标准模块

    from urllib.request import urlopen  #python自带模块
    url = 'https://www.cnblogs.com/RainBol/p/9835136.html'#定义一个网站
    #get请求 res = urlopen(url).read()#发送get# 请求,并用read读取内容,再用res接收结果 pa = res.decode()#获取到的是二进制类型,需要转换 with open('com.html','w',encoding='utf-8') as f: f.write(pa)#把内容写到本地保存起来,相当于一个简单的爬虫 from urllib.parse import urlencode #post请求 data = {'username':'admin','password':123456} url2 = 'http://xxxlogin/login/rainbol_login' print(urlencode(data))#返回结果为 username=admin&password=123456这种格式的字符号 data = urlencode(data) res = urlopen(url2,data.encode()).read()#发送post请求,后面参数将data转成二进制类型,并read取内容,保存到res中 print(res.decode())#再将而二进制类型转成字符串 import json d = json.loads(res.decode())#将字符串转成json print(d.get('session_id'))#取到session值做处理 #处理太麻烦,所以下面我们使用requests模块

    requests库  

      封装了urlib的内容,在代码量上明显与urlib模块少

      requests中response对象的属性

       res.status.code#获取http状态码
       res.text#获取http响应内容的字符串形式
       res.encoding#从http header中猜测的响应内容编码方式
       res.apparent_encoding#从内容中分析出的响应内容编码方式(备选编码方式)
       res.content#http响应内容的二进制形式

      requests.request,既然是封装,其实就是request的内置方法了

      kv = {'k1':'v1','k2':'v2'}

      r = requests.request('GET','http://xxx.com',params=kv)  

      (method,url,**kwargs)

        其中**kwargs为可选,其中有很多字段

          params参数:对url进行修改

          data参数,

          json参数,

          header参数:定制协议头,

          cookie参数,

          auth参数,

          files参数,

          timeout参数:设定的超时时间(秒为单位)

          proxies:字典认证,设定访问代理服务器,可以增加登录认证,使用此参数可以隐藏爬取用户原ip地址信息

          allow_redirects:True/False  默认为True,重定向开关

          stream:True/False  默认为True,对获取的内容立即下载

          verify:True/Flase   默认为True,认证SSL证书开关  

          cert:本地SSL证书路径

          

      print(r.url)#获取url链接,kv参数会在url后面自动拼接?k1=v1&k2=v2

      get请求

    import requests
    #requests.get(url,params=None,**kwargs)
    params:url中的额外参数,字典或字节流格式
    #get请求 url = 'https://www.cnblogs.com/RainBol/p/9835136.html' res = requests.get(url)#请求url,如果get请求有参数一定是params=后面跟字典
    print(res.text)#text获取页面内容,返回字符串

      post请求

    #post请求
    #requests.post(url,data=None,json=None,**kwargs) data = {'username':'admin','password':123456} res = requests.post(url,data = {'username':'admin','password':123456})#参数名是data后面跟字典,
    requests可以请求验证ssl证书,当我们请求https会用到,如果验证失败会抛出错误,要求参数添加上传证书都verify=False可以跳过,或者加cert参数,可以包含多个证书的元祖
    print(res.json())#返回一个字典 print(res.text)#返回json格式的字符串

      二进制文件处理

    #请求二进制文件
    url = 'https://pic.cnblogs.com/avatar/1463363/20180812122954.png'
    res = requests.get(url)
    tupian = res.content#返回二进制文件内容
    with open('picture.jpg','wb') as f:
        f.write(tupian)#写入二进制文件到本地

      请求添加cookies,headers

    res = requests.get(url,cookies = {"k":"v","xxx":"xxxx"},
                       header = {"session":"s3298&G","xxx":"xxxx"})#关键字,字典

      上传json类型

    data = {'username':"aaa","password":123345,"phone":"138100000"}
    res = requests.post(url,json=data)

      上传文件

    url = 'www.xxxupload.com/rainbol/upload'
    res = requests.post(url,files = {'参数名k':open('文件名','rb')})
    print(res.json())

    fastapi接口开发

    pip install fastapi

    pip install uvicorn

    import fastapi
    import uvicorn
    from pydantic import BaseModel
    
    server = fastapi.FastAPI()
    
    #params传参参数
    @server.get('/')
    def index(id: int, sex: str):
        if sex == 'nan':
            data = {'id': id, 'sex': ''}
        else:
            data = {'id': id, 'sex': ''}
        return data
    
    #json参数传参
    class User(BaseModel):
        username: str
        password: str
        user_id: int
    
    
    @server.post('/hh')
    def home(u:User):
        print(u.user_id)
        return {'id': u.user_id, 'username': u.username, 'password': u.password}
    
    
    if __name__ == '__main__':  # 一定要加上这句话才行
        uvicorn.run('demo1:server', port=12000, debug=True)  # demo1为python文件名

    fastapi内置了swagger,所以可以通过/docs参看接口文档

    版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    Mapjoin和Reducejoin案例
    自定义InputFormat和OutputFormat案例
    shullfe机制详解
    辅助排序和Mapreduce整体流程
    Mapreduce的排序(全局排序、分区加排序、Combiner优化)
    Mapreduce中maptask过程详解
    Mapreduce的序列化和流量统计程序开发
    SpringCloud-熔断器
    Mybatis 之$与#
    限流算法
  • 原文地址:https://www.cnblogs.com/RainBol/p/9902708.html
Copyright © 2020-2023  润新知