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

大型项目目录结构:

问题引入:

在上篇文章讲蓝图的时候我给了一个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.mzph.cn/news/240870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云吴结生:云计算是企业实现数智化的阶梯

云布道师 近年来,越来越多人意识到,我们正处在一个数据爆炸式增长的时代。IDC 预测 2027 年全球产生的数据量将达到 291 ZB,与 2022 年相比,增长了近 2 倍。其中 75% 的数据来自企业,每一个现代化的企业都是一家数据公…

大创项目推荐 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 *…

Excel 获取当前行的行数

ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发

【H3C】交换机VLAN配置

交换机配置 ACCESS配置方式 u t m //关闭提示 sys //进入系统视图 vlan 10 to 11 //批量创建vlan10到11 int g1/0/1 //进接口 port link-type access //配置接口类型access,t…

Linux--Shell脚本应用实战

实验环境 随着业务的不断发展,某公司所使用的Linux服务器也越来越多。在系统管理和维护过程中,经 常需要编写一些实用的小脚本,以辅助运维工作,提高工作效率。 需求描述 > 编写一个名为getarp.sh的小脚本,记录局域…

大数运算·字符串相加·阶乘

大数,就是C/C中利用基本类型所不能存储的数字,少则数十位,大则几万位,如何存储和计算大数就是本文的内容。 在C和C中,没有存储大数的数据结构,就算 unsigned long long也只能表示19位的数字  如果我们用d…

PHP案例代码:PHP如何提供下载功能?

对Web开发人员来说,“下载”功能是一个非常常见的需求。在网站中提供文件下载,通常用于提供用户手册、软件升级、音乐、视频等各种资源文件。本教程将向您介绍如何实现一个PHP下载功能,同时告诉浏览器文件名称、文件大小、文件类型,并统计下载次数。 首先,我们需要了解一些…

免费PHP完美运营的最新短视频打赏系统学习版

免费PHP完美运营的最新短视频打赏系统学习版 一、介绍 免费PHP完美运营的最新短视频打赏系统学习版,是一款基于PHP开发的打赏系统,具有强大的功能和稳定的性能。相比于市面上的其他打赏系统,它更加完善,几乎无bug,能…

openGauss学习笔记-171 openGauss 数据库运维-备份与恢复-导入数据-深层复制

文章目录 openGauss学习笔记-171 openGauss 数据库运维-备份与恢复-导入数据-深层复制171.1 使用CREATE TABLE执行深层复制171.1.1 操作步骤 171.2 使用CREATE TABLE LIKE执行深层复制171.2.1 操作步骤 171.3 通过创建临时表并截断原始表来执行深层复制171.3.1 操作步骤 openGa…

MATLAB ga函数的使用方法

一、ga句法结构 x ga(fitnessfcn,nvars) x ga(fitnessfcn,nvars,A,b) x ga(fitnessfcn,nvars,A,b,Aeq,beq) x ga(fitnessfcn,nvars,A,b,Aeq,beg,IB,UB) x ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon) x ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options) x …

vue的表单收集案例

Vue的表单收集案例 这只是最基础的表单收集&#xff0c;并未涉及到element-ui。 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>收集表单数据</title><script type"text/javascript" src"../js…

LabVIEW的六轴工业机器人运动控制系统

LabVIEW开发六轴工业机器人运动控制系统 本项目开发了一个高效的工业机器人控制系统&#xff0c;重点关注于运动学算法和轨迹规划算法的实现和测试。LabVIEW作为一个关键技术&#xff0c;在项目中扮演了核心角色。 系统研究与算法开发&#xff1a;首先&#xff0c;项目围绕机…

大IP时代文旅品牌如何用数字人玩转数字营销?

在大IP时代&#xff0c;有IP意味着话题、人气、流量以及变现能力&#xff0c;文旅品牌如何打造一个成功的、受欢迎的IP&#xff0c;拓宽文旅资源价值&#xff0c;成为文旅品牌营销的一大痛点。随着元宇宙概念兴起&#xff0c;数字人IP可以满足文旅品牌多元化需求&#xff0c;文…

React学习计划-React16--React基础(二)组件与组件的3大核心属性state、props、ref和事件处理

1. 组件 函数式组件&#xff08;适用于【简单组件】的定义&#xff09; 示例&#xff1a; 执行了ReactDOM.render(<MyComponent/>, ...)之后执行了什么&#xff1f; React解析组件标签&#xff0c;找到了MyComponent组件发现组件是使用函数定义的&#xff0c;随后调用该…

ARM 点灯

.text .global _start _start: led1设置GPIOE时钟使能 RCC_MP_AHB4ENSETR[4]->1 0X50000A28LDR R0,0X50000A28 指定寄存器地址LDR R1,[R0] 将寄存器数值取出来放在R1中ORR R1,R1,#(0x1<<4) 将第4位设置为1STR R1,[R0] 将修改后的值写回去设置PE10为输出 GPIOE…

Python 爬虫之下载视频(三)

批量下载某B主视频 文章目录 批量下载某B主视频前言一、基本思路二、确定遍历循环结构三、基本思路中第12步三、基本思路中第345步总结 前言 上一篇讲了如何去获取标题和视频链接。这篇就跟大家讲一下如何去下载这些视频。本篇会以标题和 视频链接 为突破口&#xff0c;来寻找…

GrayLog日志平台的基本使用-docker容器日志接入

1、/etc/docker/daemon.json中加入如下配置并重启服务 [rootlocalhost src]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"], "log-driver": "gelf", "log-opts":…

在Jetpack Compose中使用ExoPlayer实现直播流和音频均衡器

在Jetpack Compose中使用ExoPlayer实现直播流和音频均衡器 背景 ExoPlayer与Media3的能力结合&#xff0c;为Android应用程序播放多媒体内容提供了强大的解决方案。在本教程中&#xff0c;我们将介绍如何设置带有Media3的ExoPlayer来支持使用M3U8 URL进行直播流。此外&#x…

PortSwigger Business Logic Vulnerabilities

lab1: Excessive trust in client-side controls 给了100块 买价值1337的货 在历史包里发现 尝试直接修改价格 lab2: High-level logic vulnerability 这里把加入购物车时价格可控的点修复了 但是数量可控 我们可以买负数的东西来加钱 但是返回Cart total price cannot be …

【数据结构】四、串

目录 一、定义 二、表示与实现 定长顺序存储 堆分配存储 链式存储 三、BF算法 四、KMP算法 1.求next数组 方法一 方法二&#xff08;考试方法&#xff09; 2.KMP算法实现 方法一 方法二 3.nextval 4.时间复杂度 本节最重要的就是KMP算法&#xff0c;其他要求不高…