• python-接口开发


     方法一、接口开发fastapi、uvicorn

    可直接访问自动生成的接口地址:http://启动ip:启动端口号/docs,类似swagger文档,可直接测试接口

    import fastapi
    import uvicorn
    server = fastapi.FastAPI()
    
    @server.get('/login')
    def login(username:str,password:str):
        if username.strip() and password.strip():
            p = tools.my_md5(password)
            sql = 'select * from app_myuser where username="%s"and passwd="%s";' % (username,p)
            if tools.execute_sql(sql):
                return {'code': 0, 'msg': '登陆成功!'}
            else:
                return {'code': -1, 'msg': '用户/密码错误!'}
        else:
            return {"code":-1,"msg":"必填参数未填!"}
    
    
    @server.get('/test')
    def test():
        return {"212":"登陆成功!"}
    
    
    @server.get('/pay')
    def test(money:float,status='1'):
        if status=='0':
            return {"code":1,"status":"fail"}
        elif status=='1':
            return {"code":0,"status":"success","balance":money}
    
    
    @server.post('/reg')
    def reg(username: str, password: str, cpassword: str):
        if username.strip() and password.strip() and cpassword.strip():
            if password.strip() != cpassword.strip():
                return {'code': -1, 'msg': '两次输入的密码不一样'}
            else:
                sql = 'select * from app_myuser where username="%s";' % username
                if tools.execute_sql(sql):
                    return {'code': -1, 'msg': '用户已经存在'}
                else:
                    p = tools.my_md5(password)
                    insert_sql = 'insert into app_myuser (username,passwd) value ("%s","%s");' % (username, p)
                    tools.execute_sql(insert_sql)
                    return {'code': 0, 'msg': '注册成功!'}
    
        else:
            return {'code': -1, 'msg': '必填参数不能为空'}
    
    uvicorn.run(server,port=8888,debug=True,host='0.0.0.0')

    tools.py

    import pymysql,xlwt
    import traceback
    import hashlib
    MYSQL_INFO = {
        'host':'ip',
        'user':'',
        'password':'',
        'db':'',
        'charset':'utf8',
        'autocommit':True
    }
    
    def execute_sql(sql):
        conn = pymysql.connect(**MYSQL_INFO) #xx=xxx,xx=xx,
        cur = conn.cursor(pymysql.cursors.DictCursor)
        try:
            cur.execute(sql)
        except:
            print('sql不正确')
            traceback.print_exc()
        else:
            return cur.fetchall() #None  []
        finally:
            conn.close()
            cur.close()
    
    def my_md5(s):
        s = str(s)
        s = s.encode()
        m = hashlib.md5(s)
        result = m.hexdigest()
        return result

     访问:   http://127.0.0.1:8888/docs  如下图:

    方法二、接口开发flask

    先安装一个模块:pip install flask  用它来启动一个服务,flask是一个web框架

    1、知道接口是怎么开发的
    2、避免别人操作你的数据库
    3、mock服务(模拟一个服务)

    一个简单的接口:

    1 import flask
    2 server = flask.Flask(__name__)#把当前这个python文件当做一个服务
    3 @server.route('/login',methods=['get','post'])#装饰器
    4 def zjr():
    5     return '登录成功!'
    6 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启

    启动后:

    重新运行只能启动一个,否则端口号会重复,点击服务网址,加域名(http://127.0.0.1:8989/login)

     访问服务:http://127.0.0.1:8989/login

     

     用postman访问接口

    写死的参数:

    1 import flask
    2 import json
    3 server = flask.Flask(__name__)#把当前这个python文件当做一个服务
    4 @server.route('/login',methods=['get','post'])#装饰器
    5 def zjr():
    6     res = {'code':1000,'msg':'登录成功!','sign':'sbhjsgurhuheuih'}#创建了一个字典
    7     return json.dumps(res,ensure_ascii=False)#不能直接返回字典,需要用json.dumps转成json串
    8 #ensure_ascii=False加这个参数,可以返回中文
    9 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启

    带参数传入的:

    import flask
    import json
    server = flask.Flask(__name__)#把当前这个python文件当做一个服务
    @server.route('/login',methods=['get','post'])#装饰器,下面的函数不是普通的函数而是个接口
    def zjr():
        username = flask.request.values.get('username')#是从客户端发过来的数据  
        pwd = flask.request.values.get('password')  
        if username=='zjr' and pwd == '123456':  
            res = {'code': 1000, 'msg': '登录成功!', 'sign': 'sbhjsgurhuheuih'} # 创建了一个字典   
        else: 
            res = {'code': 2000, 'msg': '账号/密码错误!'} # 创建了一个字典 
        return json.dumps(res,ensure_ascii=False)#不能直接返回字典,需要用json.dumps转成json串 #ensure_ascii=False加这个参数,可以返回中文       
     server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启

    用postman传参(k-v):

    json、cookie、headers传参:

    1 json_data = flask.request.json.get()#'获取入参是json类型的'
    2 flask.request.cookies.get('xxx')#获取cookie
    3 flask.request.headers.get('xxx')#获取headers
     

     

    练习:

    用30行代码开发一个上传、下载文件的接口

    分享一段代码,开发了3个接口:
                1、上传文件
                2、查看所有文件
                3、下载文件

    使用python开发,需要安装flask模块,使用pip install flask安装即可,代码量特别少,就能实现,加上注释总共35行代码,特别的简单,代码如下:

    import flask,os,time
    from flask import request,send_from_directory,jsonify
    app = flask.Flask(__name__)#创建一个app,代表这个web服务
    @app.route('/get_file',methods=['get'])
    def get_file():
        #下载文件接口
        filename = request.values.get('fname',None)
        #获取需要下载的文件名
        if filename:#如果获取到的文件名话
            if os.path.isfile(filename):#判断是否是一个文件
                #返回要下载的文件
                return send_from_directory('.',filename,as_attachment=True)
            else:
                return jsonify({"msg":"文件不存在!"})
        else:
            return jsonify({'msg':'文件名不能为空'})
    @app.route('/files',methods=['get'])
    def file_list():
        #获取文件列表接口
        files = os.listdir('.')#获取当前目录下所有文件
        new_files = [f for f in files if os.path.isfile(f)]
        #三元运算符,把是文件的放到list中
        return jsonify({"files":new_files})
    @app.route('/upload',methods=['post'])
    def upload():
        #上传文件接口
        f = request.files.get('file_name',None)
        if f:
            t = time.strftime('%Y%m%d%H%M%S')#获取当前时间
            new_file_name = t+f.filename#给文件重命名,防止有重复文件覆盖
            f.save(new_file_name)#保存文件
            return jsonify({"code":"ok"})
        else:
            return jsonify({"msg":"请上传文件!"})
    app.run(debug=True,port=8888)#启动这个web服务

     

    练习注册的接口

     1 import flask,pymysql
     2 import json,hashlib
     3 server = flask.Flask(__name__)#把当前这个python文件当做一个服务
     4 
     5 #操作数据库的函数
     6 def my_db(sql,port=3306,charset='utf8'):
     7     ip,user,passwd,db = '数据库ip','数据库用户','密码','数据库名字'
     8     coon = pymysql.connect(host=ip,user=user,
     9                     password=passwd,
    10                     db = db,
    11                     port=port,
    12                     charset=charset,
    13                     autocommit=True
    14                     )
    15     cur = coon.cursor()
    16     sql=sql.strip()
    17     cur.execute(sql)
    18     sql_start = sql[:6].lower()#取SQL的开头6位,转换成小写
    19     if sql.startswith('select') or sql.startswith('show'):
    20         data = cur.fetchall()
    21     else:
    22         data ='ok'
    23     cur.close()
    24     coon.close()
    25     return data
    26 
    27 #MD5加密函数
    28 def my_md5(s):
    29     m = hashlib.md5(s.encode())
    30     return m.hexdigest()
    31 
    32 @server.route('/register',methods=['post'])
    33 def reg():
    34     username = flask.request.values.get("username")  # 是从客户端发过来的数据
    35     passwd = flask.request.values.get("passwd")
    36     cpasswd = flask.request.values.get("cpasswd")
    37     if username and passwd and cpasswd:
    38         sql1 = 'select * from nhy where name="%s";'%username#数据库里是双引号“”
    39         sql_res = my_db(sql1)
    40         if sql_res:
    41             res = {'code':2001,'msg':'该用户已经被注册'}
    42         else:
    43             if passwd==cpasswd:
    44                 md5_pwd = my_md5(passwd)
    45                 sql2='insert into nhy(name,pwd) value("%s","%s");'%(username,md5_pwd)
    46                 my_db(sql2)
    47                 res = {'code':1000,'msg':'注册成功!'}
    48             else:
    49                 res = {'code': 20003, 'msg': '两次密码不一致!'}
    50     else:
    51         res = {'code':20002,'msg':'必填参数未填,请查看接口文档!'}
    52     return json.dumps(res,ensure_ascii=False)
    53 
    54 server.run(port=8989,debug=True)#启动服务,接口写完了启动一次;debug=True是修改代码后自动重启

    
    
  • 相关阅读:
    poj2104 Kth-Number
    bzoj2120 数颜色
    hdu5145 NPY and girls
    bzoj2734 集合选数
    bzoj3732 NetWork
    bzoj2152 聪聪可可
    hdu2036(多边形面积)
    超大次幂思路
    hdu 2030 统计汉字个数
    Hibernate 配置文件与映射文件 总结
  • 原文地址:https://www.cnblogs.com/Mezhou/p/9348025.html
Copyright © 2020-2023  润新知