Python Flask: 打造高可用flask mvc框架
来自CloudWiki
项目结构(初始版)
├─common 存放公用部分 │ ├─libs 公用方法或者类 │ │ │ UrlManager.py │ │ │ │ │ └─__pycache__ │ │ UrlManager.cpython-37.pyc │ │ │ └─models 所有的数据库model ├─config 配置文件 │ base_setting.py 基础配置 │ local_setting.py 开发环境 │ production_setting.py 本地开发环境配置 │ __init__.py │ ├─docs │ mysql.md 所有数据库变更必须在这里记录 │ ├─jobs │ │ __init__.py │ │ │ └─tasks 所有定时任务都存放在这里 │ __init__.py │ ├─web │ application.py :封装的Flask的全局变量,包括app,数据库等 │ list.txt │ manager.py 启动入口 │ readme.md │ requirements.txt python扩展 │ www.py :HTTP模块相关初始化 │
项目配置_初始版
config
base_setting.py:
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/mysql?charset=utf8mb4' SQLALCHEMY_TRACK_MODIFICATIONS = False
requirements.txt
flask flask-sqlalchemy mysqlclient flask_script
application.py
原始版:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) db = SQLAlchemy(app)
改进版(自定义应用Application):
from flask import Flask from flask_sqlalchemy import SQLAlchemy class Application( Flask ): def __init__(self,import_name): super( Application,self ).__init__( import_name ) self.config.from_pyfile( 'config/base_setting.py' ) db.init_app( self ) db = SQLAlchemy() app = Application( __name__ )
manager.py
from application import app def main(): manager.run( ) if __name__ == '__main__': try: import sys sys.exit( main() ) except Exception as e: import traceback traceback.print_exc()
运行
通过这个文件manager.py 运行项目 :
python manager.py:
* Serving Flask app "application" (lazy loading) * Environment: production �[31m WARNING: This is a development server. Do not use it in a production deployment.�[0m �[2m Use a production WSGI server instead.�[0m * Debug mode: off * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
项目配置_flask_script版
config/base_setting.py
添加端口配置:
SERVER_PORT = 8999
application.py
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_script import Manager class Application( Flask ): def __init__(self,import_name): super( Application,self ).__init__( import_name ) self.config.from_pyfile( 'config/base_setting.py' ) db.init_app( self ) db = SQLAlchemy() app = Application( __name__ ) manager = Manager(app)#将app进行包装
manager.py
from application import app,manager from flask_script import Server import www ##web server manager.add_command( "runserver", Server( host='0.0.0.0', \ port=app.config['SERVER_PORT'],use_debugger = True ,use_reloader = True) ) def main(): manager.run( ) if __name__ == '__main__': try: import sys sys.exit( main() ) except Exception as e: import traceback traceback.print_exc()
运行
py -3.7 manager.py runserver
(3.7为python版本号)
* Serving Flask app "application" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on * Restarting with windowsapi reloader * Debugger is active! * Debugger PIN: 600-024-529 * Running on http://0.0.0.0:8999/ (Press CTRL+C to quit)
项目配置_自动选择脚本
application.py
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_script import Manager import os class Application( Flask ): def __init__(self,import_name): super( Application,self ).__init__( import_name ) self.config.from_pyfile( 'config/base_setting.py' ) if "ops_config" in os.environ: self.config.from_pyfile( 'config/%s_setting.py'%os.environ['ops_config'] ) db.init_app( self ) db = SQLAlchemy() app = Application( __name__ ) manager = Manager(app)#将app进行包装
local_settting.py
SERVER_PORT = 8998
验证
可通过以下参数 设置引入什么环境变量 D:\teaching\自动化运维\2021-2022-2\code\mooc4>set ops_config=local
D:\teaching\自动化运维\2021-2022-2\code\mooc4>py -3.7 manager.py runserver
* Serving Flask app "application" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on * Restarting with windowsapi reloader * Debugger is active! * Debugger PIN: 600-024-529 * Running on http://0.0.0.0:8998/ (Press CTRL+C to quit)
项目配置_脚本分类配置
base_setting.py
SERVER_PORT = 8999 DEBUG = False SQLALCHEMY_ECHO = False
local_setting.py
一般地,数据库连接不放在base配置里,因为不同环境 数据库连接的参数不一样。
DEBUG = True SQLALCHEMY_ECHO = True SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/mysql?charset=utf8mb4' SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_ENCODING = "utf8mb4"
最终目录
application.py :封装的Flask的全局变量,包括app,数据库等 common :存放公用部分 libs 公用方法或者类 models 所有的数据库model config :配置文件 base_setting-py:基础配置 develop_setting-py:开发环境 local_setting_demo.py:本地开发环境配置 demoproduction_setting-py:生产环境的配置 docs:文档存放 Mysql.MD所有数据库变更必须在这里记录 jobs :定时任务 bin tasks 所有定时任务都存放在这里 manage.py:启动入口 release.sh:系统自己的简单操作脚本,包括更新代码,重启应用 requirements.txt :python扩展 uwsgi.ini:生产环境uwsgi web HTTP存放 controllers 所有的C层放在这里 interceptors 拦截器相关 static 静态文件 templates 模板文件 www.py : HTTP模块相关初始化