(十七)Flask之大型项目目录结构示例【二扣蓝图】

news/2024/10/19 2:17:12/

大型项目目录结构:

问题引入:

在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱!

所以改进之处就是给每个蓝图单独设置templates和static目录在创建蓝图的的时候通过指定static_foldertemplate_folder属性实现】

  • 在创建蓝图对象时,通过传递static_foldertemplate_folder参数来指定蓝图的静态文件和模板文件目录【注意:这些参数接收相对于蓝图所在包或模块的路径】
from flask import Blueprintauth_bp = Blueprint('auth', __name__, static_folder='auth-static', template_folder='auth-templates')

这样,每个蓝图都可以拥有自己独立的静态文件和模板文件目录,使得不同蓝图下的资源能够被正确加载和渲染。

需要注意的是:

  • 创建蓝图对象时指定的模板文件目录优先级低于创建Flask应用程序对象时指定的模板文件目录(默认为templates文件夹)。

demo项目结构如下:

在这里插入图片描述

  • run.py:

    from flask_struct import appif __name__ == '__main__':app.run()
  • flask_struct/__init__.py

    from flask import Flask
    from .admin import admin
    from .web import webapp = Flask(__name__)
    app.debug = Trueapp.register_blueprint(admin, url_prefix='/admin')
    app.register_blueprint(web)
  • admin/views.py:

    from . import admin@admin.route('/index')
    def index():return 'Admin Index'
    
  • admin/__init__.py

    from flask import Blueprintadmin = Blueprint('admin',__name__,template_folder='templates',static_folder='static'
    )
    from . import views
  • web/views.py:

    from . import web@web.route('/index')
    def index():return 'Web Index'
    
  • web/__init__.py

    from flask import Blueprintweb = Blueprint('web',__name__,template_folder='templates',static_folder='static'
    )
    from . import views

基于前面十六篇文章给出的一个Demo结构,后续还会有更好的!
要努力学习专栏哦~

拓展一:pipreqs库

pipreqs 是一个用于生成Python项目依赖列表(requirements.txt 文件)的第三方库。它可以扫描项目代码,找出代码中所使用的外部库,并将这些库及其版本信息写入 requirements.txt 文件中,方便项目的共享和部署。

  1. 安装 pipreqs

    在终端或命令提示符中运行以下命令安装 pipreqs

    pip install pipreqs
    
  2. 生成 requirements.txt 文件

    在项目目录中,运行以下命令生成 requirements.txt 文件:

    pipreqs /path/to/your/project
    

    这会扫描指定项目目录下的Python文件,找出项目所依赖的外部库,并将它们写入 requirements.txt 文件中。

    如果想要指定输出文件的位置,可以使用以下命令:

    pipreqs /path/to/your/project --savepath custom_requirements.txt
    

    这样会将依赖列表保存到 custom_requirements.txt 文件中。

需要注意的是,pipreqs 会尽量准确地找出项目中的依赖,但有时候它可能会漏掉一些动态导入或其他特殊情况。因此,在生成 requirements.txt 文件后,需要检查!确保所有的依赖都被正确地包含在内。

拓展二:Python中,一个东西后面可以加括号,可能是哪些情况?

在Python中,当一个对象后面加上括号时,它可能是以下几种类型之一:

  1. 函数:一个函数是可调用的对象。通过在函数名后加上括号,可以执行该函数并传递相应的参数。

  2. 方法:方法是属于类的函数。通过在实例或类名后加上括号,可以调用该方法并传递相应的参数。

  3. 类:类本身也是可调用的对象。通过在类名后加上括号,可以创建类的实例。

  4. 对象:某个类的实例对象也可以是可调用的对象。通过在对象名后加上括号,可以调用该对象所属类中定义的特殊方法,例如__call__()方法。

拓展三:什么是函数?什么是方法?

在Python中,函数(function)和方法(method)是两种不同的概念。

  • 函数(function)是一段封装了特定功能的可重用代码块。它接收输入参数,执行特定的操作,并返回结果。函数可以在任何地方定义和使用,不依赖于任何类或对象。它们通常用于模块化代码、提高代码的复用性和可维护性。
  • 如下是一个简单的函数示例:
def add(a, b):return a + bresult = add(2, 3)
print(result)  # 输出:5
  • 方法(method)是属于某个类的函数。它定义在类的内部,并且可以访问类的属性和其他方法。方法通过对类的实例进行调用来执行相应的操作。每个方法的第一个参数通常都是 self,它表示方法所属的实例对象。
  • 如下是一个简单的类和方法示例:
class Circle:def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius * self.radiuscircle = Circle(5)
circle_area = circle.area()
print(circle_area)  # 输出:78.5

在上面的示例中,area()Circle 类的一个方法,它可以通过 circle.area() 的方式进行调用。

总结起来,函数是独立的可调用代码块,而方法是属于类的函数,需要通过类的实例进行调用。

  • 易混淆案例:
class Demo(object):def fetch(self):passprint(Demo.fetch)obj = Demo()
print(obj.fetch)

在这里插入图片描述

可以发现上面那个是函数,而下面那个是方法。

箴言:对于一个类里的函数,究竟是方法还是函数。取决于谁调用它!


http://www.ppmy.cn/news/1279401.html

相关文章

前端开发新趋势:Web3、区块链和虚拟现实

目录 前言 Web3:下一代互联网 区块链技术 去中心化应用程序(DApps) 区块链:重塑数字世界 数字钱包 NFT(非同质化代币) 虚拟现实:沉浸式体验 WebVR和WebXR 三维图形 新挑战与机会 性…

2023.12.21 关于 Redis 常用数据结构 和 单线程模型

目录 各数据结构具体编码方式 查看 key 对应 value 的编码方式 Reids 单线程模型 经典面试题 IO 多路复用 Redis 常用数据结构 Redis 中所有的 key 均为 String 类型,而不同的是 value 的数据类型却有很多种以下介绍 5 种 value 常见的数据类型 注意&#xff1…

Unity 创建/删除/启用/禁用组件的惯用方法

1、创建组件&#xff1a; Unity 创建组件可以通过编辑器中的"Add Component"创建&#xff0c;或者代码动态创建&#xff1a;GameObject.AddComponent<T>()&#xff0c;如&#xff1a; ameObject.AddComponent<Rigidbody>(); 2、删除组件&#xff1a; …

初识Docker-什么是docker

Docker是一个快速交付应用、运行应用的技术 目录 一、Docker 二、运用场景 一、什么是Docker&#xff1f;它的作用是什么&#xff1f; Docker如何解决大型项目依赖关系复杂&#xff0c;不同组件依赖的兼容性问题? Docker允许开发中将应用、依赖、函数库、配置一起打包&…

基于vue与three.js,监听FPX(Stats类使用)

第一步&#xff0c;引入stats类并new出来 import Stats from three/examples/jsm/libs/stats.module.js; data(){return {stats : new Stats(),} } 第二步&#xff0c;添加dom mounted() {this.init3D();this.animate();window.addEventListener("keydown", this.…

2023美团机器人研究院学术年会成功举办

2023年12月19日&#xff0c;深圳市美团机器人研究院学术年会在清华大学深圳国际研究生院成功落下帷幕。会议回顾了研究院成立一年来的进展和成果&#xff0c;并邀请了各界专家共同讨论机器人技术的未来发展趋势。此外&#xff0c;年会期间还举办了首届低空经济智能飞行管理挑战…

【笔记】Spring是什么

什么是spring&#xff1f; Spring的基础知识铺垫 IOC AOP<-Spring->容器->生态 先说你的认知&#xff0c;总-分结构 spring是一个基础的框架&#xff0c;同时提供了Bean的容器&#xff0c;用来方便装载具体的Bean对象&#xff0c;之前在使用对象的时候必须自己new&…

【网络编程】网络通信基础——简述TCP/IP协议

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、ip地…