Flak项目拆分

flask项目拆分重构实例 由于好久没有用flask框架做项目。一时间忘记了 flask的拆分。在这里做一个笔记,供大家参考、 我们先来安装一下需要的依赖库 pip install flask_script pip install flask_sqlalchemy pip install flask_migrate 一、利用pycharm创建一个flask项目。 会得到这样一个目录 其中从上至下,第一个文件为pycharm... 阅读详情

Flask项目拆分

为什么要 拆分

  • 让代码更有层次更清晰
  • 提升代码的扩展性
  • 方便多人协作
  • 拆分规则:MTV
  • 高内聚,低耦合,将同一类事务的所有操作封装在一起,提高内聚。将具体操作进行分层,降低耦合

拆分后的项目

manage.py 负责管理整个项目

# 从系统环境变量中加载配置
env = os.environ.get("FLASK_ENV") or "default"

app = create_app(env)

manager = Manager(app)
manager.add_command("db", MigrateCommand)
if __name__ == '__main__':
    manager.run()

App文件夹存 放具体项目

__ init__
def create_app(env):
    # 创建Flask对象
    app = Flask(__name__)

    # 加载配置  初始化配置
    app.config.from_object(envs.get(env))

    # 初始化扩展库  加载扩展库
    init_ext(app)
  # 加载中间件
    load_middleware(app)
    # 初始化路由  加载路由
    init_blue(app)

    return app
extension.py 各种第三方扩展库,除路由
db = SQLAlchemy()
migrate = Migrate()
cache = Cache(config={
    "CACHE_TYPE": "redis",
    "CACHE_REDIS_URL": "redis://:rock1204@10.0.127.143:6379/1"
})


def init_ext(app):
    db.init_app(app)
    migrate.init_app(app, db)
    cache.init_app(app)
setting Flask配置
def get_db_uri(dbinfo):

    database = dbinfo.get("DATABASE")
    driver = dbinfo.get("DRIVER")
    user = dbinfo.get("USER")
    password = dbinfo.get("PASSWORD")
    host = dbinfo.get("HOST")
    port = dbinfo.get("PORT")
    name = dbinfo.get("NAME")

    return "{}+{}://{}:{}@{}:{}/{}".format(database, driver, user, password, host, port, name)


class Config:
    SECRET_KEY = "rock1204"

    DEBUG = False

    TESTING = False

    SQLALCHEMY_TRACK_MODIFICATIONS = False

#开发环境
class DevelopConfig(Config):
    DEBUG = True
    dbinfo = {
        "DATABASE": "mysql",
        "DRIVER": "pymysql",
        "USER": "root",
        "PASSWORD": "*****",
        "HOST": "localhost",
        "PORT": "3306",
        "NAME": "FlaskProject"
    }

    SQLALCHEMY_DATABASE_URI = get_db_uri(dbinfo)

#测试环境
class TestingConfig(Config):
    TESTING = True

    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:rock1204@localhost:3306/FlaskProject"

#演示环境
class StagingConfig(Config):
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:rock1204@localhost:3306/FlaskProject"

#生产环境
class ProductConfig(Config):
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:rock1204@localhost:3308/FlaskProject"


envs = {
    "develop": DevelopConfig,
    "testing": TestingConfig,
    "staging": StagingConfig,
    "product": ProductConfig,
    "default": ProductConfig
}
views视图函数
#总路由
def init_blue(app):
    app.register_blueprint(blueprint=user_blue)
    app.register_blueprint(blueprint=movie_blue)

#分路由
user_blue = Blueprint("user_blue", __name__, url_prefix="/users")
@user_blue.route("/")
def index():
    return "Hello Index"
@user_blue.route("/create/")
def create():
    db.create_all()
    return "创建成功"
#分路由
@movie_blue.route("/learn/")
#  缓存配置   timeout 缓存过期时间
@cache.cached(timeout=60)
def learn():

    print("开始学习")
    sleep(10)
    print("终于学完了")

    return "睡着了,做梦了"

model模型
class Movie(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    m_name = db.Column(db.String(256))
    m_detail = db.Column(db.String(256))
middleware中间件(AOP)
  • 拓展:面向过程(POP)、面向对象(OOP)、面向接口(IOP)、面向切面(AOP)

  • 面向过程:典型的是C/C++的结构体,结构体里只有变量,没有处理变量的方法,需要专门编写处理变量的方法。

    面向对象:ArrayList list=new ArrayList();坏处是如果改为LinkedList,所有代码可能需要重写,同时扩展一个新的List的话,需要重新调用。

    面向接口:List=new Arraylist();是面向对象的一种形式,广义上讲,抽象类也是接口的一种形式,使用该类的某种属性(接口)来表示,降低耦合性,增加代码复用性。

    面向切面:这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

    def load_middleware(app):
    
        @app.before_request
        def app_before():
            print(request.remote_addr)
            print(request.url)
            print(request.path)
    
            if request.path == "/movies/":
                addr = request.remote_addr
                ip = addr.split(".")[-1]
                if int(ip) > 50:
                    if random.randrange(100) > 20:
                        return "恭喜您特等奖"
    
        @app.before_request
        def before():
            print("before")
    
        @app.after_request
        def after(resp):
            print(type(resp))
            print("xxx")
    
            return resp
    
        @app.errorhandler(500)
        def error500(exce):
    
            print(type(exce))
    
            return "跳转到首页"
    

migration迁移文件

迁移命令自动生成

四大内置对象

  • request 请求对象

  • session 会话技术入口

  • g 单次请求中的全局。服务器默认是多线程的,实现数据的跨函数传递

  • config flask内置配置文件

    <ul>
        {% for con in config %}
            <li>{{ con }}</li>
        {% endfor %}
    
    </ul>
    
    • sqlalchemy_binds
      sqlalchemy_engine_options
      sqlalchemy_database_uri
      secret_key
      sqlalchemy_commit_on_teardown
      session_cookie_httponly
      preserve_context_on_exception
      session_refresh_each_request
      send_file_max_age_default
      sqlalchemy_pool_size
      sqlalchemy_native_unicode
      session_cookie_name
      json_as_ascii
      preferred_url_scheme
      session_cookie_path
      sqlalchemy_record_queries
      json_sort_keys
      application_root
      trap_http_exceptions
      testing
      session_cookie_domain
      env
      sqlalchemy_max_overflow
      templates_auto_reload
      jsonify_mimetype
      sqlalchemy_pool_timeout
      sqlalchemy_track_modifications
      trap_bad_request_errors
      permanent_session_lifetime
      debug
      use_x_sendfile
      jsonify_prettyprint_regular
      sqlalchemy_echo
      session_cookie_secure
      explain_template_loading
      session_cookie_samesite
      sqlalchemy_pool_recycle
      propagate_exceptions
      server_name
      max_content_length
      max_cookie_size

    debug
    use_x_sendfile
    jsonify_prettyprint_regular
    sqlalchemy_echo
    session_cookie_secure
    explain_template_loading
    session_cookie_samesite
    sqlalchemy_pool_recycle
    propagate_exceptions
    server_name
    max_content_length
    max_cookie_size

python flask框架项目拆分 一 \结构 二\manage.py from flask_migrate import MigrateCommand from flask_script import Manager from app import create_app app = create_app() manager = Manager(app) manager.add_command('db',Migrat... 阅读详情

相关推荐

Python Flask框架项目拆分

在开发Python Flask框架项目时,随着功能的增加和代码的复杂度提高,一个单一的应用程序文件可能会变得冗长且难以维护。通过以上步骤,我们成功地将Python Flask项目拆分为多个模块或文件,以提高代码的可读性、可扩展性和可维护性。通过将核心逻辑、路由和视图函数、数据库模型以及视图模块分别放置在不同的文件中,我们可以更好地组织和管理项目代码。在函数中,我们通过查询数据库获取特定用户名的用户信息,并将其传递给模板进行渲染。文件用于定义数据库模型。在上面的示例中,我们定义了两个路由,分别对应根路径和。

NfsVerilog的博客 339

Flask框架(一)——项目拆分

主要介绍了Flask项目的拆分,以便我们更好的管理代码。

m0_71233415的博客 1240

Cloud分布式微服务

SpringCloud Config 将配置信息中央化保存, 配置SpringCloud Bus可以实现动态修改配置文件。 SpringCloud Bus 分布式消息队列,是对Kafka, MQ的封装。 SpringCloud Security 对Spring Security的封装,并能配合Netflix使用。

★Python轻量级Web框架Flask(2)——Flask模板渲染/Flask项目拆分模板

1、执行说明:首先程序会在app.py中开始执行,执行中第一步会将App这个包导入,然后就会执行App中的__init __.py文件,然后会在__init __.py文件导包时,去执行views.py中的代码,然后从views.py中导包时,进入到models.py中。

sz1125218970的博客 1462

鸿蒙手机卸载内置应用 adb连接

**傻瓜式删除鸿蒙系统内置应用,自己亲测有效。**

JJDXBT的博客 3万+

LabVIEW小白福音:手把手教你用NI采集卡搭建振动信号采集系统(附源码和避坑指南)

本文为LabVIEW初学者提供详细的NI采集卡振动信号采集系统搭建指南,涵盖硬件连接、驱动安装、信号处理及性能优化等关键步骤。特别针对振动信号采集系统中的常见问题提供解决方案,并附源码和避坑指南,帮助用户快速上手并避免常见错误。

weixin_30485379的博客 103

flask项目拆分

一、flask项目拆分的目的 1、松耦合,降低代码之间的联系。 2、使代码结构更清晰。 二、拆分方案 1、一份拆成6份 2、在拆之前只有一个manage文件,所有东西都在一起 如今拆分开为6份。 (1)、manage进行全局控制 (2)、在项目执行向前进行初始化 初始化配置 初始化路由 初始化第三方 (3)、配置文件 配置项目所需各种信息 (4)、视图函数 用来处理业务逻辑,协调模板和模型 (5)...

qq_44240254的博客 729

Apifox 自动化测试新增流程控制条件,复杂测试场景不再是问题

在 if 条件后的输入框填写请求接口得到的变量 viewed ,选择条件为「小于」,输入比较数值 10 ,并在 if 条件下添加「宠物下架处理」步骤。借助新增的自动化测试流程控制条件,测试人员就可以使用 Apifox 去实现更深层更多样的测试应用场景,帮助提升测试效率,减少复杂场景的测试操作。「查询新建宠物」、「修改宠物状态为已售出」和「查询宠物状态是否修改」步骤为当前在售宠物信息盘点的三个标准步骤,所以将这三个步骤合成一组。在循环中添加「查询在售宠物」和「修改宠物状态」步骤;

877

Python Flask模块化拆分

flask模块化拆分

羽茉的博客 986

MaxEnt软件的下载与安装

1、下载网站:http://lucky-boy.ys168.com/ (这是之前在网上搜到的,里面有许多软件安装包,感谢网页主的资源共享,违权必删)

weixin_42191203的博客 2万+

[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记

最近开始学习网络安全相关知识,接触了好多新术语,感觉自己要学习的东西太多,真是学无止境,也发现了好几个默默无闻写着博客、做着开源的大神。接下来系统分享一些网络安全的自学笔记,希望读者们喜欢。 上一篇文章分享了看雪Web安全总结知识和一个异或解密的示例,本篇文章着重讲解Chrome浏览器保留密码功能渗透解析及登录加密入门笔记,结合实际例子一步步实现浏览器漏洞的挖掘。非常基础的文章,希望对入门的博友们有帮助,大神请飘过,谢谢各位看官!

杨秀璋的专栏 2万+

【Flask框架】10、Flask项目拆分规范

在实际开发中,为了更好的管理和维护大型的Flask项目。通常会采用模块化的方式来组织代码。这种方式通常会将主应用与各个模块(Blueprint)分离。并且将静态资源和模版文件分开管理。

qq_45490227的博客 857

AUTOSAR OS演示项目搭建与验证

请注意,以上代码只是一个简单的示例,用于说明AUTOSAR OS项目的搭建和验证过程。此外,AUTOSAR OS还提供了其他功能和API,如事件、消息队列和任务间通信等,可以根据实际需求进行使用。AUTOSAR OS是AUTOSAR架构中的一部分,它提供了一种可移植且可扩展的操作系统,用于管理嵌入式应用程序的任务和资源。通过以上步骤,我们成功搭建了一个基于AUTOSAR OS的演示项目,并验证了应用程序任务的执行顺序。3、打开app.c文件,并编写一个简单的应用程序,作为我们的示例任务。

weixin_50547796的博客 195

第一课 python-Flask的MTV拆分

Flask 第一课项目MVC拆分 tags: Flask 2019千锋教育 categories: flask MVC 项目拆分 文章目录Flask 第一课项目MVC拆分第一节 flask的Hello world1. flask基本知识第二节 Flask的命令行工具1. 命令行工具flask-script2. flask-script使用第三节 第一阶段_拆路由1. 着手拆分2. ...

QnHyn 809

手把手教你学simulink实例--基于Simulink的储能系统性能评估与仿真

储能系统是现代能源体系中的关键组成部分,广泛应用于可再生能源并网、电网调峰调频、电力质量改善以及电动汽车充电等领域。为了提高储能系统的运行效率和可靠性,对其性能进行准确评估至关重要。基于MATLAB/Simulink平台,可以构建储能系统的动态模型,并通过仿真分析其在不同工况下的性能表现。本项目旨在研究储能系统的建模方法、控制策略及其性能评估指标,并通过Simulink仿真验证系统的动态特性和稳态性能。

MHD0815的博客 195

电源防反接保护电路全攻略实战A04

本文深入剖析了硬件设计中电源保护电路的关键技术与实战经验。文章指出,保护电路虽小但至关重要,通过对比分析二极管与MOSFET防反接方案,揭示了MOSFET在效率、温控方面的优势。针对过压保护,重点讲解了TVS二极管选型要点,强调钳位电压而非击穿电压才是保护核心。文章结合工业案例(如48V通信模块烧毁、5V系统MOSFET过热等),详细阐述了PCB布局规范、热设计路径等工程细节,并提供了USB接口ESD防护的完整选型方案。最后强调硬件设计必须考虑最坏工况,在成本与性能间找到平衡点,避免因小失大。

启芯硬件的博客 777

Flask之MVC拆分(Blueprint-->蓝图)

一、新建flask项目默认结构 自动创建完成了templates、static两个资源文件夹,一个管理文佳app.py 二、使用蓝图(Blueprint)进行项目拆分,将MVC拆分开来 1、创建各个文件 settings.py(配置文件) models.py(数据库模型文件) init.py(项目初始化文件) ext.py(依赖库初始化文件) views.py(视图文件) 2、 安装需要的插件库(Blueprint) pip install flask-blueprint(蓝图插件) pip ins

qq_45061361的博客 1050

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Flask 学习笔记(九)-项目拆分

项目拆分 目的 解耦合 代码结构更清晰 拆分方案 一拆六 以前就一个manage文件 manage进行全局控制 在应用初始化做初始化 初始化配置 初始化路由 初始化第三方 配置文件 配置项目所需各种信息 视图函数 用来处理业务逻辑,协调模板和模型 模型文件 定义模型 外部扩展 统一管理扩展 项目结构 manage.py ...

Sajor的博客 951

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

FlaskMVC模式开发(应用拆分,模型拆分)

Flask MVC模式开发(应用拆分,模型拆分) 随着Flask项目开发的进行,你会发现把模型定义和视图函数写在一个文件里有多乱,一方面找具体某个函数时你的鼠标可能需要在几百行,甚至上千行的代码中溜来溜去,很浪费时间有没有啊。 所以需要进行拆分,但这时又非常容易出现循环导包的情况,所以经过我多方寻找与研究终于找到了解决办法。 祭上我的GitHub链接 https://github.com/Prolht/FUE/tree/master/backend ...

Just Do It 601

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

flask 之(五) --- 对象|钩子|拆分

内置对象 request:  请求的所有信息 session   服务端会话技术的接口 config:   当前项目的配置信息,模板中可以直接使用 g:global  在单次请求过程中,实现全局数据共享(可以帮助开发者实现跨函数传递数据) from flask import Blueprint, render_template, g from .mode...

baoding4359的博客 293

Flask入门,项目拆分,蓝图,反向解析,request

Flask静态使用 url_for(‘static’,filename=‘hello.csss’’ 项目拆分 from flask_script import Manage from app import create_app app = create_app() manage = Manage(app) if __name__ == '__main__' 新建目录App,并在App的init文...

weixin_45505952的博客 257

INFO [alembic.env] No changes in schema detected. 那些年踩过的坑。

刚在写flask项目一直遇到db init后一起无法db migrate 我的flask项目拆分结构是: db的加载是在init_ext()里面 这时编写我的model init.py下的 这时models.py下的__init__.py 分析了各种原因,最终发现原来是我们之写了Model,这个时候app是不知道我们的模型在哪,所以必须在其他地方引用一下。可以在api的位置加上。 ...

qq_36850938的博客 1201

第四章:FLASK结构拆分和循环引入问题

一,上节回顾:   1)flask最小应用代码。 from flask import Flask app = Flask(__name__) @app.route('/hello') def hello(): return 'hello' if __name__ == '__main__': app.run()      2) fla...

weixin_30797027的博客 216

Flask笔记

filter可以用于非等值操作,而fliter_by只能等值操作。写一个controller(apis)一般使用Vue开发前后端分离项目。重新迁移一般不需要执行init。filter后可以继续过滤。一般的话都序列化成字符串。exts.py(放插件)删除views,不用蓝图。

qq_56127002的博客 1551

flask02项目拆分

对flask项目进行简单拆分: 修改成mvc模式: 使用 flask-script 拓展将 app.py 文件修改成manager.py 修改项目结构: 路由管理: 直接将视图写到view.py 里面是不会被加载到服务器的; 并且相互导入文件但是不能出现循环引用。 要解决的问题是: views需要导入app对象,但是app对象又需要调用到views。 故可以将app对象,放到...

qq_43213352的博客 615

使用python编写web项目,第三节,过渡,从项目文件的拆分到创建数据库模型

上一级讲了怎么对项目文件做一个基本的拆分,以及同步数据库中可能会出现的问题,这一节以讲解思路为主,技术性内容较少。

2301_78783890的博客 1017
上一篇: 上传文件
下一篇: FlaskRestful
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值