flask web开发学习之初识flask(三)
文章目录
- 一、flask扩展
- 二、项目配置
- 1. 直接配置
- 2. 使用配置文件
- 3. 使用环境变量
- 4. 实例文件夹
- 三、flask命令
- 四、模版和静态文件
- 五、flask和mvc架构
一、flask扩展
flask扩展是指那些为Flask框架提供额外功能和特性的库。这些扩展通常遵循Flask的设计原则,易于集成到flask应用中,并且可以大大加快开发速度。
常用flask扩展:
Flask-SQLAlchemy:操作SQLAlchemy,它是一个强大的关系型数据库框架。
Flask-Migrate:基于Alembic的Flask扩展,用于处理SQLAlchemy数据库迁移。
Flask-WTF:整合了WTForms的Flask扩展,提供表单类和验证功能。
Flask-Login:提供用户会话管理,处理用户登录、登出和记住我功能。
Flask-Mail:提供邮件发送支持。
Flask-RESTful:用于快速开发REST API的Flask扩展。
Flask-HTTPAuth:用于HTTP认证的简单扩展。
Flask-Caching:提供缓存支持,可以与多种后端如Redis、Memcached等配合使用。
Flask-Session:一个Flask扩展,用于服务器端会话管理。
Flask-Admin:提供一个简单的界面来管理数据模型。
Flask-SocketIO:为Flask应用添加WebSocket支持。
Flask-CORS:处理跨源资源共享(CORS),使得你可以在Flask应用中轻松地处理跨域请求。
二、项目配置
1. 直接配置
可以直接在创建 Flask 应用实例后,通过字典的方式对其进行配置:
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'your_secret_key'
2. 使用配置文件
在项目目录下创建config.py文件,将配置进行集中管理。
DEBUG = True
SECRET_KEY = 'your_secret_key'
SQLALCHEMY_DATABASE_URI = 'sqlite:///your-database.db'
然后在应用中加载此文件
import configapp = Flask(__name__)
app.config.from_object('config')
3. 使用环境变量
使用环境变量来配置Flask应用,能够让你的应用根据运行的环境(如开发环境、测试环境和生产环境)加载不同的配置,而无需更改代码。这样做有助于保护敏感信息,比如数据库的用户名和密码,不被直接存储在源代码中,同时也便于在不同的环境之间迁移应用。
在Unix-like系统(包括Linux和Mac OS X)中,你可以在命令行中设置环境变量,如下:
export YOURAPPLICATION_SETTINGS=/path/to/settings.cfg
在Windows系统中,你可以使用以下命令:
set YOURAPPLICATION_SETTINGS=/path/to/settings.cfg
假设setting.cfg文件中内容为:
DEBUG=False
SECRET_KEY='production_secret_key'
SQLALCHEMY_DATABASE_URI='mysql://user:password@localhost/dbname'
在Flask中,你可以使用app.config.from_envvar()函数来加载一个指向配置文件的环境变量。例如:
app = Flask(__name__)
app.config.from_envvar('YOURAPPLICATION_SETTINGS')
当你运行你的Flask应用时,它会读取YOURAPPLICATION_SETTINGS环境变量指定的配置文件,并加载其中的配置项。
在开发过程中,手动设置环境变量可能会有些不方便。为了解决这个问题,你可以使用Python-dotenv这样的库来自动地从.env文件中加载环境变量。
在.env文件中写入(.env文件的使用在flask web开发学习之初识flask(二)已提到过:
YOURAPPLICATION_SETTINGS=/path/to/settings.cfg
4. 实例文件夹
Flask允许你定义一个实例文件夹来存放私密配置信息。实例文件夹通常位于应用的根路径,与 static 和 templates 文件夹同级,并且不应该被版本控制系统跟踪(如.gitignore中应包含instance/)。
app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile('config.py', silent=True)
三、flask命令
除了flask内置的flask run等命令,我们也可以自定义命令。
通过创建任意一个函数,并为其添加app.cli.command()装饰器,我们就可以注册一个flask命令。
import click@app.cli.command()
def hello():click.echo('Hello, zly!')
函数的名称即为命令名称,这里注册的命令为hello,你可以使用flask hello命令来触发,也可以在app.cli.command()装饰器中传入参数来设置命令名称,比如传入"hello1",就可以使用flask hello1来触发。
四、模版和静态文件
在Flask中,模版和静态文件是构建动态网站的重要组成部分。它们通常用于呈现内容和提供客户端所需的样式和脚本。
模版(Templates):
模版是包含响应文本的文件,它们通常包含变量和表达式,这些变量和表达式在渲染时会被实际的值替换。这样,你就可以生成动态的HTML页面,其中的内容可以根据服务器端的数据来变化。
Flask默认使用Jinja2模版引擎来渲染模版。Jinja2是一个强大的模版引擎,它允许你使用类似Python的语法在模版中插入逻辑。
模版文件通常放置在Flask项目的 templates 文件夹中。以下是一个简单的模版示例:
<!-- templates/hello.html -->
<html>
<head><title>Hello Template</title>
</head>
<body><h1>Hello, {{ name }}!</h1>
</body>
</html>
在这个模版中,{{ name }} 是一个变量,它将在渲染模版时被传递到模版的值所替换。在Flask视图函数中,你可以使用 render_template 函数来渲染模版,并传递需要的变量:
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/hello/<name>')
def hello(name):return render_template('hello.html', name=name)
静态文件(Static Files)
静态文件包括通常不会改变的文件,如CSS样式表、JavaScript脚本、图片等。这些文件直接由浏览器请求和加载,不需要经过服务器端的处理。
在Flask项目中,静态文件默认放在 static 文件夹中。
在HTML模版中引用这个静态文件,你可以使用Jinja2提供的 url_for 函数:
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
这里的 url_for(‘static’, filename=‘style.css’) 调用会生成指向静态文件 style.css 的URL。
五、flask和mvc架构
Flask是一个轻量级的Web应用框架,它提供了构建Web应用所需的基本工具和功能。虽然Flask本身并不强制使用任何特定的架构模式,但它非常灵活,可以很容易地用来实现MVC(Model-View-Controller)架构模式。
在mvc架构中,程序被分为三个组件:数据处理(Model),用户界面(View),交互逻辑(Controller)。
严格来说,flask并不是mvc架构的框架,因为他没有内置数据模型支持。在flask中,我们可以这样实现mvc框架,模板文件=>View,视图函数=>Controller,ORM工具定义数据模型=>Model。
相关文章:

flask web开发学习之初识flask(三)
文章目录 一、flask扩展二、项目配置1. 直接配置2. 使用配置文件3. 使用环境变量4. 实例文件夹 三、flask命令四、模版和静态文件五、flask和mvc架构 一、flask扩展 flask扩展是指那些为Flask框架提供额外功能和特性的库。这些扩展通常遵循Flask的设计原则,易于集成…...

【设计模式-3.1】结构型——外观模式
说明:本文介绍设计模式中结构型设计模式中的,外观模式; 亲手下厨还是点外卖? 外观模式属于结构型的设计模式,关注类或对象的组合,所呈现出来的结构。以吃饭为例,在介绍外观模式之前࿰…...
flutter学习-day2-认识flutter
📚 目录 简介特点架构 框架层引擎层嵌入层 本文学习和引用自《Flutter实战第二版》:作者:杜文 1. 简介 Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App&#…...
解决selenium使用.get()报错:unknown error: unsupported protocol
解决方法 将原来的: url "https://www.baidu.com" browser.get(url)替换为: url "https://www.baidu.com" browser.execute_script(f"window.location.replace({url});") # 直接平替 .get()问题解析 之前运行都是正…...

关于加密解密,加签验签那些事
面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口ÿ…...

容器重启后,Conda文件完整保存(虚拟环境、库包),如何重新安装conda并迁移之前的虚拟环境
Vim安装 容器重启后默认是vi,升级vim,执行命令 apt install -y vim安装 Anaconda 1. 下载Anaconda 其他版本请查看Anaconda官方库 wget https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.03-1-Linux-x86_64.sh --no-check-certificate…...

gitee对接使用
1.创建一个文件夹 2.进入Gitee接受对方项目编辑 3.打开终端初始化一开始创建的文件夹 git init 3.1打开终端 3.2输入git.init 4.克隆对方的项目 4.1进入Gitee复制对方项目的路径 4.2在编辑器终端内克隆对方项目 git clone 网址 如此你的编辑器就会出现对方的项目 …...

C语言中的一维数组与二维数组
目录 一维数组数组的创建初始化使用在内存中的存储 二维数组创建初始化使用在内存中的存储 数组越界 一维数组 数组的创建 数组是一组相同类型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面这个数组能否成功创建? int count…...

【Linux】地址空间
本片博客将重点回答三个问题 什么是地址空间? 地址空间是如何设计的? 为什么要有地址空间? 程序地址空间排布图 在32位下,一个进程的地址空间,取值范围是0x0000 0000~ 0xFFFF FFFF 回答三个问题之前我们先来证明地址空…...

作为一个产品经理带你了解Axure的安装和基本使用
1.Axure的简介 Axure是一种强大的原型设计工具,它允许用户创建交互式的、高保真度的原型,以及进行用户体验设计和界面设计。Axure可以帮助设计师和产品经理快速创建和共享原型,以便团队成员之间进行沟通和反馈。Axure提供了丰富的交互组件和功…...

接口测试总结及其用例设计方法
接口测试的总结文档 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分:主要介绍…...

2023团体程序设计天梯赛——模拟赛和总决赛题
M-L1-1 嫑废话上代码 Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。 输出格式: 在一行中输出…...

智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.参考…...

视频中自监督学习:「我的世界」下指令理解与跟随
本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展,题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 GROOT 该研究的核心目标是探索能否摆脱文本数据的标…...

Spring基于xml半注解开发
目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解,主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置,使用Component注解替代<bean>标签中的id以及class属性,而对…...

功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试,具体是干嘛的?
软件测试是一个广义的概念,他包括了多领域的测试内容,比如,很多新手可能都听说:功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试等&#…...

oracle 下载java之前版本
登录oracle官网:Oracle | Cloud Applications and Cloud Platform 点击resource 进入该页面 点击这个 出现之前版本...

LLM之Agent(四)| AgentGPT:一个在浏览器运行的Agent
AgentGPT是一个自主人工智能Agent平台,用户只需要为Agent指定一个名称和目标,就可以在浏览器中链接大型语言模型(如GPT-4)来创建和部署Agent平台。 PS:目前agentGPT仅支持chatgpt模型,暂时不支持本地llm模…...

AGM离线下载器使用说明
AGM专用离线下载器示意图: 供电方式: 通过 USB 接口给下载器供电,跳线 JP 断开。如果客户 PCB 的 JTAG 口不能提供 3.3V 电源,或仅需烧写下载器,尚未连接用户 PCB 时,采用此种方式供电。 或者:…...

viple与物理机器人(一):线控模拟
为了检测viple程序与物理机器人是否能顺利连接上 如果能顺利连接上,那么,可以通过内建事件从而控制物理机器人的前进、后退、左转、右转以及暂停。 如果不能连接上,首先,程序无法控制物理机器人,其次,当vip…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...

vue3 手动封装城市三级联动
要做的功能 示意图是这样的,因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...