基于Flask的python服务创建

前言

最近遇到一个java调python的问题。过去我们的架构是java通过ssh进入python服务器然后执行命令来运行。这对后面升级非常不友好,而且开发负责度高。所以现在考虑开发一个python服务,通过http的方式调用python模型。

调研

初期调研python的web服务框架(有点类似SpringBoot的那种),市面上常用的大概分两种:

  • Django:市面上使用率最高的,功能齐全,三方库丰富
  • Flask:轻便,功能简单

网上有一个有趣的例子,可以理解成Django是豪华装修房,而Flask是毛坯房。而我们只需要有个地方放东西(模型)即可。
所以结合我们的需求,我们只需要把已有模型以http的形式发布出去提供调用并计算,不需要做很多的业务逻辑操作。结合人力成本与自身需求,最后选择了毛坯房,也就是基于Flask来构建一个python服务。

服务创建

这里IDE使用PyCharm。我们只需要在创建服务的时候选择Flask应用即可。这里建议勾选创建新的虚拟环境。这样做的原因主要方便开发,因为python没有maven统一依赖包。所以会导致团队里每个开发者的依赖版本都不一样,最后导致代码冲突。
而创建了虚拟环境,每个开发者就可以以它为基准进行不同层面上的开发。更能在部署服务器的时候直接使用该环境的版本配置
在这里插入图片描述
创建完成之后的包结构大概是这样的

  • Project
    • static:存放静态文件
    • templates:存放模板
    • app.py:服务启动入口,类似SpringBoot的XXXApplication.java

我们稍微一下app.py的内容

# 引入包
from flask import Flask
# 创建flask app,可以理解成spring applicationContext
app = Flask(__name__)

# 创建接口
@app.route('/')
def hello_world():
    return 'Hello World!'

# 启动服务,实际运行只需要执行这里的main就可以了
if __name__ == '__main__':
    app.run()

结构的改造

由于上面的目录结构过于简单,不便于我们代码的归类于开发。所以我们稍微对项目结构进行改造。

  1. 根目录创建一个文件夹命名apps
  2. 根目录创建一个文件夹命名为config,此时的项目架构为
  • Project
    • static:存放静态文件
    • templates:存放模板
    • apps:存放具体的代码
    • config:存放配置文件
    • app.py:服务启动入口,类似SpringBoot的XXXApplication.java
  1. 在apps文件夹内创建服务的相关包,这里可以按照个人开发习惯创建,这里我贴出我的包目录
    在这里插入图片描述
  2. 在config包里面添加服务总配置文件Config.py,并针对不同环境设定不同的配置
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : Config.py
# @Author: Richard Chiming xu
# @Date  : 2021/1/13
# @Desc  : 项目总配置类
import os

# 项目通用配置
class BaseConfig(object):
    PORT = 5000
# 开发配置
class DevConfig(BaseConfig):
    # 数据库信息
    DB_HOST = ''
    DB_PORT = ''
    DB_DBNAME = ''
    DB_USER = ''
    DB_PWD = ''
	# 是否启动debug
    DEBUG = True
# 测试配置
class TestConfig(BaseConfig):
    # 数据库信息
    DB_HOST = ''
    DB_PORT = ''
    DB_DBNAME = ''
    DB_USER = ''
    DB_PWD = ''
	# 是否启动debug
    DEBUG = True
# 生产配置
class ProdConfig(BaseConfig):
    # 数据库信息
    DB_HOST = ''
    DB_PORT = ''
    DB_DBNAME = ''
    DB_USER = ''
    DB_PWD = ''
	# 是否启动debug
    DEBUG = True
# 对应的map
config_map = {
    "development": DevConfig,
    "test": TestConfig,
    "production": ProdConfig
}
# 根据系统环境FLASK_ENV,获取配置变量
def getConfig():
    deploy_env = os.getenv('FLASK_ENV', 'development')
    return config_map.get(deploy_env)

这里注意,针对机器要先预设一个FLASK_ENV的系统环境变量,后续修改启动类的时候也会用到
5. 修改apps里的__init__.py,把服务创建移植到这里

import os

from flask import Flask, g

from apps.controller.ERAnalysisController import eranalysis_mapping
from apps.controller.TestController import test_mapping
from apps.respostry import models
from config import LogHandle
from config.Config import config_map

def create_app():
	# 创建flask app
    app = Flask(__name__)
    # 获取系统环境变量
    deploy_env = os.getenv('FLASK_ENV', 'development')
    # 根据环境加载配置文件
    app.config.from_object(config_map.get(deploy_env))
    app.logger.addHandler(LogHandle.getLogHandler())
    # 注册蓝图(flask的mvc需要注册这个)
    app.register_blueprint(eranalysis_mapping)
    app.register_blueprint(test_mapping)
    # 激活上下文(激活applicationContext),后续就可以使用flask.current_app读取配置文件
    ctx = app.app_context()
    ctx.push()

    return app
  1. 修改原来的app.py
from flask import request, jsonify, Flask
from flask_script import Manager

from apps import create_app
from apps.entity import AIExecption
from apps.entity.response import HttpResult
from apps.respostry import models
# 调用上一步的方法创建app
app = create_app()

@app.route('/')
def hello_world():
    return '欢迎来到AI平台服务!'
# 读取配置,运行服务
if __name__ == '__main__':
    app.run(port=app.config['PORT'],debug=app.config['DEBUG'],threaded=True)

项目运行

至此,项目的搭建已经完成。我们点击IDE的执行按钮,或者命令行在根目录执行

python app.py

然后你看到类似这样的日志,就说明服务运行成功

FLASK_APP = app.py
FLASK_ENV = development
FLASK_DEBUG = 1
In folder E:/Project/python/AI_Service
E:\Project\python\AI_Service\venv\python.exe -m flask run
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 404-020-996
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

在浏览器中访问http://127.0.0.1:5000/ 就可以得到下面结果
在这里插入图片描述

总结

这篇文章主要介绍如何创建一个基于Flask的python服务。然后在基础的项目结构上进行改造,以达到更适合我们的开发习惯,进而方便代码的开发与阅读。至此我们已经成功的创建了一个Flask服务。
下一篇文章将讲解基于Flask的Restful API与日志的配置

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值