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版

拓展: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模块相关初始化