广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Flask搭建api服务的实现步骤
  • 946
分享到

Flask搭建api服务的实现步骤

2024-04-02 19:04:59 946人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

flask是一个使用 python 编写的轻量级 WEB 应用框架,很适合个人开发,我们在此处做一个接口。 为方便调试,本文使用get接口方式。get接口十分简单,不需要上传任何数据

flask是一个使用 python 编写的轻量级 WEB 应用框架,很适合个人开发,我们在此处做一个接口。

为方便调试,本文使用get接口方式。get接口十分简单,不需要上传任何数据,在路径后面添加一个get方法就可以用,返回的是字符串

本文只是Flask开发的接口的初步文档,从最简单的接口开发到稍微复杂一些的接口,后续如有时间,会逐步完善,包括token鉴权、跨域认证、蓝图应用、日志管理等等。

9f93e13632d9b5a77f3ea76746b87714.png

第一步,首先在configs中配置数据源

configs.py

HOST = '127.0.0.1'
PORT = '5432'
DATABASE = 'runoobdb'
USERNAME = 'postgres'
PASSWord = '*****'
# 配置主数据库
DB_URI = "postgresql+psycopg2://{username}:{password}@{host}:{port}/{db}".fORMat(username=USERNAME, password=PASSWORD,
                                                                                 host=HOST, port=PORT, db=DATABASE)
# sqlALCHEMY_DATABASE_URI = 'postgresql+psycopg2://postgres:*****@127.0.0.1:5432/runoobdb'
# 连接其他数据库
SQLALCHEMY_BINDS = {
    'xxxdb': 'postgresql+psycopg2://postgres:123456@localhost:5432/lincms3',
    'yyydb': 'postgresql+psycopg2://postgres:123456@localhost:5432/lincms4',
    'zzzdb': 'sqlite:///users.db'
}
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATioNS = False
SQLALCHEMY_ECHO = True

第二步,在exts中定义全局db

exts.py

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

第三步,构造了一个flaskutils,在这里定义一些接口应用到的公共类,比如数据转码,将数据集转换为JSON,解析url逗号参数等等,后续将在此基础上拓展功能。

flaskutils.py

import decimal
 
import numpy as np
import json, datetime,configparser
 
 
class DataEncoder(json.JSONEncoder):
    """数据转码类    """
    def default(self, obj):
        """针对无法转json的数据类型进行转码
        目前支持的转码类型        1、将Numpy的intger,floating转为int和float
        2、将Numpy的ndarray转为list
        3、将np.datetime64转化为字符串前10位        4、将datetime.datetime转化为"%Y-%m-%d %H:%M:%S"
        5、将datetime.date转化为"%Y-%m-%d"
        6、将bytes转化为utf-8字符串
        入参:
            obj: 数据对象
        出参:
            转化后的数据
        异常:
            无        """
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, np.datetime64):
            return str(obj)[:10]
        elif isinstance(obj, datetime.datetime):
            return obj.strftime("%Y-%m-%d %H:%M:%S")
        elif isinstance(obj, datetime.date):
            return obj.strftime("%Y-%m-%d")
        elif isinstance(obj, decimal.Decimal):
            return float(obj)
        elif isinstance(obj, bytes):
            return str(obj, encoding='utf-8')
        else:
            return json.JSONEncoder.default(self, obj)
 
 
def getsqlresultjson(db, sql,params={}):
    """根据db和sql语句,将结果集转换为json格式
    根据db和sql语句,将结果集转换为json格式
    第一步:根据cursor获取元数据,生成键值列表
    第二步:遍历结果集,将键值列表和结果集组装成字典,加入列表
    第三步:将列表通过DataEncoder进行转码
    入参:
        db: 数据库实例.
        sql: 待运行的SQL语句
    出参:
        Json格式:
        举例:        {'Serak': ('Rigel VII', 'Preparer'),
          'Zim': ('Irk', 'Invader'),
         'Lrrr': ('Omicron Persei 8', 'Emperor')}
    异常:
        无    """
    resultdict = []
 
    cursor = db.session.execute(sql,params=params).cursor
    resultproxy = db.session.execute(sql,params=params).fetchall()
 
    # 获取元数据
    colname = [i[0] for i in cursor.description]
    # 获取结果集,组成字典,加入列表
    for rowproxy in resultproxy:
        rowresult = dict(zip(colname, rowproxy))
        resultdict.append(rowresult)
 
    # 生成json格式
    jsonstr = json.dumps(resultdict, cls=DataEncoder)
    return jsonstr
 
 
def parasecommaparamtolist(param):
    '''
    处理in传递参数,in传递参数可适用于两种传递方式,逗号传递参数或参数传递
    此处主要是处理,逗号传递参数,返回为list
    # Http://127.0.0.1:5000/getresultbysqlgetparaminbylist?sqlid=sql10&begindate=2018&enddate=2020&kpicode=03010101
    # http://127.0.0.1:5000/getresultbysqlgetparaminbylist?sqlid=sql10&begindate=2018&enddate=2020&kpicode=03010101&kpicode=031111111
    # http://127.0.0.1:5000/getresultbysqlgetparaminbylist?sqlid=sql10&begindate=2018&enddate=2020
    # http://127.0.0.1:5000/getresultbysqlgetparaminbylist?sqlid=sql10&begindate=2018&enddate=2020&kpicode=03010101,222222222
    # http://127.0.0.1:5000/getresultbysqlgetparaminbylist?sqlid=sql10&begindate=2018&enddate=2020&kpicode=03010101&kpicode=03010101
    :param param:
    :return:
        字符串列表    '''
    result = []
    for val in param.split(','):
        if val:
            result.append(val)
    return result

第四步,在app文件构建初始版本

app.py

import configs
from exts import db
from flask import Flask
from flaskutils import *
from flask import request,jsonify
 
app = Flask(__name__)
 
# 加载配置文件
app.config.from_object(configs)
app.debug = True
 
db.init_app(app)
 
if __name__ == '__main__':
    print(app.url_map)
    app.run(host='0.0.0.0', port=8080)

第五步,在app文件中配置sql语句,原本想尝试一下mybis类型的配置文件,后来决定简化;主要包括三条sql,第一条不需要传参,第二条传递常规参数,第三条传递in参数,尤其是in参数,基本上网上找到的方法都不可靠,本文算是原创吧。

sqldict={}
sqldict['sql1'] = """select a.*
from kpi_value a
where a.kpicode in ('01010101','02010101','03010101')
and a.datelevel='01'
and a.regionlevel='02'
"""
sqldict['sql2'] = """select a.*
from kpi_value a
where a.kpicode in ('01010101','02010101','03010101')
and a.datelevel='01'
and a.regionlevel='02'
and a.datecode>=:begindate and a.datecode<=:enddate
"""
sqldict['sql3'] = """select a.*
from kpi_value a
and a.datelevel='01'
and a.regionlevel='02'
and a.datecode>=:begindate and a.datecode<=:enddate
and a.kpicode in :kpicode
"""

1、构造第一个最简单sql返回接口,不需要传递sql参数,但需要传递sqlid参数

@app.route('/getresultbysql', methods=['GET', 'POST'])
def index1():
    sqlid = request.args.get('sqlid')
    sqltext=sqldict[sqlid]
    jsonstr = getsqlresultjson(db,sqltext)
    return jsonstr, 200, {"Content-Type": "application/json"}

2、构造一个sql内部传参的接口,通过字典参数方式

@app.route('/getresultbysqlparam', methods=['GET', 'POST'])
def index2():
    sqlid = request.args.get('sqlid')
    sqltext=sqldict[sqlid]
    params = {"begindate": '2017',"enddate":'2019'}
    jsonstr = getsqlresultjson(db,sqltext,params)
    return jsonstr, 200, {"Content-Type": "application/json"}

3、通过url进行sql参数的传递。

@app.route('/getresultbysqlgetparam', methods=['GET', 'POST'])
def index3():
    sqlid = request.args.get('sqlid')
    begindate = request.args.get('begindate')
    enddate = request.args.get('enddate')
    sqltext=sqldict[sqlid]
    params = {"begindate": begindate,"enddate":enddate}
    jsonstr = getsqlresultjson(db,sqltext,params)
    return jsonstr, 200, {"Content-Type": "application/json"}

4、通过url进行sql参数的传递,不过不传递in参数,而是在路由函数汇总内部指定in参数

@app.route('/getresultbysqlgetparamin', methods=['GET', 'POST'])
def index4():
    sqlid = request.args.get('sqlid')
    sqlid='sql3'
    begindate = request.args.get('begindate')
    enddate = request.args.get('enddate')
    sqltext=sqldict[sqlid]
    incond = ['01010101',  '03010101']
    params = {"begindate": begindate,"enddate":enddate,'kpicode':tuple(incond)}
    jsonstr = getsqlresultjson(db,sqltext,params)
    return jsonstr, 200, {"Content-Type": "application/json"}

5、通过url进行in参数和普通参数的传递,这里可以支持两种方式,一种是&aa=xxx&aa=yyy,一种是aa=xxx,yyy。

@app.route('/getresultbysqlgetparaminbylist', methods=['GET', 'POST'])
def index5():
    sqlid = request.args.get('sqlid')
    sqlid='sql3'
    begindate = request.args.get('begindate')
    enddate = request.args.get('enddate')
    incond=request.args.getlist('kpicode')
 
    if len(incond) == 1 and ',' in incond[0]:
        incond = parasecommaparamtolist(incond[0])
 
    sqltext=sqldict[sqlid]
    params = {"begindate": begindate,"enddate":enddate,'kpicode':tuple(incond)}
    jsonstr = getsqlresultjson(db,sqltext,params)
 
    return jsonstr, 200, {"Content-Type": "application/json"}

6、标准化接口响应返回结果。

@app.route('/getresultbysqlgetparaminbylistresponse', methods=['GET', 'POST'])
def index6():
 
    retinfo={}
    errorflag=False
    retinfo['returncode'] = 200
    retinfo['returndata'] = ''
    retinfo['returninfo'] = '处理成果'
    sqlid = request.args.get('sqlid')
    begindate = request.args.get('begindate')
    enddate = request.args.get('enddate')
    incond = request.args.getlist('kpicode')
 
    if len(incond) == 1 and ',' in incond[0]:
        incond = parasecommaparamtolist(incond[0])
    if not incond:
        retinfo['returninfo']=retinfo['returninfo'] +'未传入KPI编码'
        errorflag=True
    if not begindate:
        retinfo['returninfo'] = retinfo['returninfo'] + '未传入开始时间'
        errorflag=True
    if not enddate:
        retinfo['returninfo'] = retinfo['returninfo'] + '未传入结束时间'
        errorflag=True
    if begindate>enddate:
        retinfo['returninfo'] = retinfo['returninfo'] + '开始时间大于结束时间'
        errorflag=True
    if errorflag==True:
        retinfo['returncode'] = 400
        response = jsonify(retinfo)
        response.status_code = 400
        return response
 
    sqltext = sqldict[sqlid]
    params = {"begindate": begindate, "enddate": enddate, 'kpicode': tuple(incond)}
    jsonstr = getsqlresultjson(db, sqltext, params)
    retinfo['returndata']  = jsonstr
    response = jsonify(retinfo)
    response.status_code = 200
    return response

到此这篇关于Flask搭建api服务的实现步骤的文章就介绍到这了,更多相关Flask搭建api服务内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Flask搭建api服务的实现步骤

本文链接: https://www.lsjlt.com/news/151204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flask搭建api服务的实现步骤
    Flask是一个使用 Python 编写的轻量级 Web 应用框架,很适合个人开发,我们在此处做一个接口。 为方便调试,本文使用get接口方式。get接口十分简单,不需要上传任何数据...
    99+
    2022-11-13
  • Flask搭建一个API服务器的步骤
    一、API列表  1. 获取作品列表 ① 获取手工制作作品列表。 请求格式: http://api.mculover666.cn:9999/twkk/list/hand...
    99+
    2022-11-12
  • WinPC搭建nginx服务器的实现步骤
    目录修改端口设置项目常用命令官网下载Windows稳定版包,解压后,双击nginx.exe启动nginx。 也可以命令行CD到nginx.exe所在目录后,执行:start ngin...
    99+
    2023-01-28
    Win搭建nginx服务器 nginx搭建服务器
  • maven私服搭建的实现步骤
    目录私服说明搭建maven私服从私服下载jar到本地仓库修改默认中央仓库私服说明 ​ maven仓库分为本地仓库和远程仓库,而远程仓库又分为maven中央仓库、其他远程仓...
    99+
    2022-11-12
  • 使用Golang搭建web服务的实现步骤
    如何用golang搭建一个web服务呢?菜鸟官网的go web编程教程已经介绍了web服务器的工作原理,这里就不赘述了。 我们先看个例子:http.go package main ...
    99+
    2022-11-13
  • Flask如何搭建一个API服务器
    小编给大家分享一下Flask如何搭建一个API服务器,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、API列表 1. 获取作品列表① 获取手工制作作品列表。请求格式:http://api.mculover666...
    99+
    2023-06-15
  • Centos8搭建本地Web服务器的实现步骤
    1 概述 系统centos8,利用httpd搭建本地web服务器. 2 安装httpd sudo yum install -y httpd 3 启动服务 service httpd starvYwhkEt 4...
    99+
    2022-06-04
    Centos8搭建本地Web centos web服务器搭建
  • linux搭建FastDFS文件服务器的实现步骤
    目录1.软件包2.安装gcc3.安装libfastcommon4.安装FastDFS5.安装tracker6.安装storage7.测试图片上传8.安装Nginx。9.安装fastdfs-nginx-module本文主要...
    99+
    2022-06-04
    linux搭建FastDFS
  • SpringMVC的工程搭建步骤实现
    目录一、创建项目二、配置核心文件三、web.xml四、配置TomCat五、运行TomCat一、创建项目 1、新建一个项目名为:springmvc-demo-yuyongqing 右键...
    99+
    2022-11-12
  • TypeScript环境搭建的实现步骤
    目录1. 安装TS环境2. 安装 ts-node3. 安装nodemon4. Parcel打包支持浏览器运行TS文件前提是已经装好了node.js,node.js安装图文教程&nbs...
    99+
    2022-11-12
  • Windows Server2016AD服务器搭建的步骤
    搭建Windows Server 2016 AD服务器的步骤如下:1. 确保你已经安装了Windows Server 2016操作系...
    99+
    2023-09-14
    Windows
  • VSCode搭建vue项目的实现步骤
    目录一、安装环境:二、建项目:一、安装环境: 1.默认Vscode、nodejs已经安装好了 2.全局安装vue-cli,vue-cli帮助我们快速构建Vue项目。 npm inst...
    99+
    2022-11-13
  • 搭建本地云服务器的步骤
    1. 确定服务器需求 在搭建本地云服务器之前,首先需要确定你的服务器需求。考虑以下几个因素: - 预算:确定你的预算范围,以便选择适合的硬件和软件。 - 服务器规模:确定你需要的服务器规模,包括处理器、内存、存储空间等。 - 服务器用途:...
    99+
    2023-10-28
    步骤 服务器
  • Git服务器的详细搭建步骤
    这篇文章主要介绍“Git服务器的详细搭建步骤”,在日常操作中,相信很多人在Git服务器的详细搭建步骤问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Git服务器的详细搭建步骤”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-04
  • Flask项目的部署的实现步骤
    目录宝塔更新Python版本更改默认的Python版本项目部署设置映射宝塔更新Python版本 因为在宝塔中的Python版本为2.6.8,使用宝塔Python项目管理的话需要把Py...
    99+
    2022-11-10
  • Redis的Cluster集群搭建的实现步骤
    目录一、引言二、Redis的Cluster模式介绍1、Redis群集101 2、Redis群集TCP端口 3、Redis集群和Docker 4、Redis集群数据分片 5、Redis...
    99+
    2022-11-12
  • MacBook M1 Flutter环境搭建的实现步骤
    目录一、基础环境搭建 git:Flutter SDK:CocoaPods:二、安装IDEIDEA:Xcode:AndroidStudio:三、跑一个app试试最近入手了Ap...
    99+
    2022-11-12
  • redis搭建哨兵集群的实现步骤
    目录redis安装部署redis集群架构配置redis主从测试主从搭建redis哨兵集群哨兵集群详解:哨兵集群原理哨兵集群redis安装部署 环境说明: redis使用的是6.2.6...
    99+
    2022-11-13
  • vue-cli5搭建vue项目的实现步骤
    vue-cli 的最新版本是5.0.4 首先需要全局安装 vue-cli yarn global add @vue/cli 已经安装的可以升级到最新版 yarn global up...
    99+
    2022-11-13
  • node快速搭建后台的实现步骤
    1.首先安装node,express,express-generator (4.x版本把generator分离出来了所以需要单独安装) 2.进入项目文件输入命令express 项目名...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作