前言
最近遇到一个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()
结构的改造
由于上面的目录结构过于简单,不便于我们代码的归类于开发。所以我们稍微对项目结构进行改造。
- 根目录创建一个文件夹命名apps
- 根目录创建一个文件夹命名为config,此时的项目架构为
- Project
- static:存放静态文件
- templates:存放模板
- apps:存放具体的代码
- config:存放配置文件
- app.py:服务启动入口,类似SpringBoot的XXXApplication.java
- 在apps文件夹内创建服务的相关包,这里可以按照个人开发习惯创建,这里我贴出我的包目录

- 在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
- 修改原来的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与日志的配置
572

被折叠的 条评论
为什么被折叠?



