
文章插图
core文件夹基本这个样子,app 是项目Flask应用初始化,settings是配置信息,应用是user和config等,static存放静态文件,templates是模板目录,requirements.txt里面配置依赖,run.py是调试使用的启动入口 。
特别的一个应用目录为:

文章插图
其中,__init__.py是module的文件,dbis.py里面都是面向数据操作的方法,models.py里面都是ORM的定义,urls.py里面是路由配置,validators.py存放参数校验方法,views.py存放视图方法,serializers.py存放序列化的方法,dbi_services.py存放构造views.py中使用的数据类型 。
我们如何将他们和Flask的应用联系起来呢,可以进行如下操作:
生成Flask的应用代码:
import osfrom flask_sqlalchemy import SQLAlchemyfrom flask_bootstrap import Bootstrapfrom flask_url.conf import FlaskUrlConffrom flask_wtf.csrf import CSRFProtectfrom flask import Flaskdb = SQLAlchemy()def create_app(import_name):"""创建Flask应用:param import_name: [str]模块名称:return:"""f_app = Flask(import_name)# 根据环境变量加载配置信息env_dict = {"DEV": "core.dev_settings","ONLINE": "core.online_settings"}env = os.environ.get("PRO_ENV", "DEV")f_app.config.from_object(env_dict.get(env, "core.dev_settings"))FlaskUrlConf(app=f_app)db.init_app(app=f_app)CSRFProtect(app=f_app)print(f_app.url_map)return f_appapp = create_app(__name__)其中使用了FlaskUrlConf(app=f_app)这个,是我自己构造的一个插件,贴出这段代码:from flask import Flaskfrom flask.blueprints import Blueprintfrom flask_url.utils import get_mod_attrdef path(rule, endpoint, view_func, **options):return Url(rule=rule, endpoint=endpoint, view_func=view_func, **options)class Url:rule = Noneendpoint = Noneview_func = Noneoptions = {}def __init__(self, rule, endpoint, view_func, **options):self.rule = ruleself.endpoint = endpointself.view_func = view_funcself.options = optionsclass FlaskUrlConf:def __init__(self, app: Flask = None):if app:self.init_app(app=app)def init_app(self, app: Flask):install_apps = app.config.get("INSTALL_APPS", [])for app_str in install_apps:mod_path = f"{app_str}.urls"try:urls = get_mod_attr(mod_path, "urls")b = Blueprint(import_name=mod_path, name=app_str)for url in urls:if isinstance(url, Url):b.add_url_rule(rule=url.rule,endpoint=url.endpoint,view_func=url.view_func,**url.options)app.register_blueprint(b)except ImportError as e:app.logger.warn(f"Import module {mod_path} err {e}")except IndexError as e:app.logger.warn(f"Split module {mod_path} attr error {e}")except AttributeError as e:app.logger.warn(f"Get attr from url module {mod_path}, error {e}")其核心思想是通过INSTALL_APPS这个配置,将各级模块儿应用下的urls.py中的urls列表进行加载,urls.py示例:from flask_url.conf import pathfrom article import viewsurls = [path(rule="/article/page/<int:a_id>/", view_func=views.get_article, endpoint="page")]那我们就完成了MVC的项目目录结构的搭建 。部署最后我们再来谈一下flask应用的部署,我们可以使用gunicorn或者uwsgi进行部署,通过nginx进行代理即可 。
uwsgi配置示例:
uwsgi]uid = rootgid = rootmaster = trueprocesses = 1listen = 10socket = 127.0.0.1:9000pidfile = /uwsgi.pid # 你的路径vacuum = truedaemonize = /uwsgi.log # 你的日志路径chdir = ${你的项目路径}home=${你的env的路径}buffer-size = 32768# 可以修改允许最大交换数据module = core.wsgi# 你的 wsgi模块路径callable = app # 选择你的应用,Flask的应用http-websockets = true # 是否启用web socketgevent = 10# 启用协程async = 10nginx配置示例server {listen8888;charset UTF-8;location ^~ /api/ {include uwsgi_params;uwsgi_pass http://127.0.0.1:9000;client_max_body_size 100m;}}以上是总结的一些内容跟大家分享,由于篇幅有限有些细节没有说清,大家可以在评论区提问 。希望大家多多支持 。推荐阅读
- 传染病及其预防
- PHP Laravel框架用户权限管理,按钮级别控制
- 白茶主要功效介绍,白茶功效及其种类先容
- 吴门画派代表人物及其作品 吴门画派的代表人物
- 字节跳动 Go RPC 框架 KiteX 性能优化实践
- 六安瓜片作用及其禁忌,六安瓜片的功效与作用
- 安茶功效与作用是什么,玉蝴蝶和胖大海的功效与作用及其饮用方法是什么
- 防风通圣散组成及其减肥功效
- 罗汉果茶及其适用人群,罗汉果茶的做法
- shiro 安全框架入门,看这一篇就够了
