【Flask从入门到精通:第二课:flask加载项目配置的二种方式、路由的基本定义和终端运行】

flask加载项目配置的二种方式

# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app = Flask(__name__)"""第一种:flask项目加载站点配置的方式"""
# app.config["配置项"] = 配置项值
# app.config["DEBUG"] = False"""第二种:flask项目加载站点配置的方式"""
# app.config是整个flask项目默认的配置属性,里面包含了所有的可用配置项,配置项的属性名都是大写字母或大小字母+下划线组成
config = {"DEBUG": True
}
app.config.update(config)# 4. 可以通过实例对象app提供的route路由装饰器,绑定视图与uri地址的关系
@app.route("/")
def index():# 5. 默认flask支持函数式视图,视图的函数名不能重复,否则报错!!!# 视图的返回值将被flask包装成响应对象的HTML文档内容,返回给客户端。return "<h1>hello flask</h1>"if __name__ == '__main__':# 3. 运行flask提供的测试web服务器程序app.run(host="0.0.0.0", port=5000)

路由的基本定义

路由和视图的名称必须全局唯一,不能出现重复,否则报错。

# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app = Flask(__name__)# 开启debug模式
app.config["DEBUG"] = True# 参数1:rule设置当前视图的路由地址
# 惨呼2:methods,设置当前视图的HTTP请求方法,允许一个或多个方法,不区分大小写
@app.route(rule="/", methods=["get", "post"])
def index():return "<h1>hello flask1</h1>"if __name__ == '__main__':# 3. 运行flask提供的测试web服务器程序app.run(host="0.0.0.0", port=5000)

什么是路由?

路由就是一种映射关系。是绑定应用程序(视图)和url地址的一种一对一的映射关系!我们在开发过程中,编写项目时所使用的路由往往是指代了框架/项目中用于完成路由功能的类,这个类一般就是路由类,简称路由。

flask中,url可以传递路由参数,有2种方式:

路由参数就是url路径的一部分。

接收任意路由参数

# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app = Flask(__name__)# 开启debug模式
app.config["DEBUG"] = True@app.route(rule="/", methods=["get", "post"])
def index():return "<h1>hello flask1</h1>""""
路由参数的传递
小括号圈住,里面写上参数变量名
在视图中即可通过参数列表按命名来接收
接收参数时,如果没有在设置路由中设置参数的类型,则默认参数类型为字符串类型
"""
@app.route("/goods/<cid>/<gid>")
def goods(gid, cid):print(gid, type(gid))print(cid, type(cid))return f"显示cid={cid},gid={gid}的商品信息"if __name__ == '__main__':# 3. 运行flask提供的测试web服务器程序app.run(host="0.0.0.0", port=5000)

接收限定类型参数

限定路由参数的类型,flask系统自带转换器编写在werkzeug/routing/converters.py文件中。底部可以看到以下字典:

# converters用于对路由中的参数进行格式转换与类型限定的
DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = {"default": UnicodeConverter, # 默认类型,也就是string"string": UnicodeConverter, # 字符串,不包含 /"any": AnyConverter,    # 任意类型"path": PathConverter,  # 也是字符串,但是包含了 /"int": IntegerConverter,"float": FloatConverter,"uuid": UUIDConverter,
}

系统自带的转换器具体使用方式在每种转换器的注释代码中有写,请留意每种转换器初始化的参数。

转换器名称描述
string默认类型,接受不带斜杠的任何文本
int接受正整数
float接受正浮点值
path接收string但也接受斜线
uuid接受UUID(通用唯一识别码)字符串 xxxx-xxxx-xxxxx-xxxxx

代码:

# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app = Flask(__name__)# 开启debug模式
app.config["DEBUG"] = True@app.route(rule="/", methods=["get", "post"])
def index():return "<h1>hello flask1</h1>""""
通过路由转换器来对路由参数显示格式转换和限制类型
"""
@app.route("/goods/<float:cid>/<uuid:gid>")
def goods(gid, cid):print(gid, type(gid))print(cid, type(cid))return f"显示cid={cid},gid={gid}的商品信息"if __name__ == '__main__':# 3. 运行flask提供的测试web服务器程序app.run(host="0.0.0.0", port=5000)

自定义路由参数转换器

也叫正则匹配路由参数.

在 web 开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要用到正则匹配,根据自己的规则去限定请求参数再进行访问

具体实现步骤为:

  • 导入转换器基类BaseConverter:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
  • 自定义转换器:自定义类继承于转换器基类BaseConverter
  • 添加转换器到默认的转换器字典DEFAULT_CONVERTERS中
  • 使用自定义转换器实现自定义匹配规则

代码实现

  • 导入转换器基类
from werkzeug.routing.converters import BaseConverter
  • 自定义转换器
class RegexConverter(BaseConverter):def __init__(self, map, *args, **kwargs):super().__init__(map, *args, **kwargs)self.regex = args[0]
  • 添加转换器到默认的转换器字典中,并指定转换器使用时名字为: re
app.url_map.converters["re"] = RegexConverter
  • 使用转换器去实现自定义匹配规则,当前此处定义的规则是:手机号码
"""
自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
"""
from werkzeug.routing.converters import BaseConverterclass RegexConverter(BaseConverter):def __init__(self, map, *args, **kwargs):super().__init__(map, *args, **kwargs)self.regex = args[0]app.url_map.converters["re"] = RegexConverter@app.route("/sms/<re('1[3-9]\d{9}'):mobile>")
def sms(mobile):return f"发送短信给手机号:{mobile}的用户"@app.route("/goods/<re('\d+'):id>")
def goods(id):return f"显示商品id={id}的信息"

运行测试:http://127.0.0.1:5000/sms/13012345671 ,如果访问的url不符合规则,会提示找不到页面

manage.py,课堂代码:

# 1. 导入flask核心类
from flask import Flask# 2. 初始化web应用程序的实例对象
app = Flask(__name__)# 开启debug模式
app.config["DEBUG"] = True"""
自定义路由转换[在实际项目开发中,我们会单独准备一个python文件来保存转换器的定义代码]
"""
from werkzeug.routing.converters import BaseConverterclass RegexConverter(BaseConverter):def __init__(self, map, *args, **kwargs):super().__init__(map, *args, **kwargs)self.regex = args[0]app.url_map.converters["re"] = RegexConverter@app.route("/sms/<re('1[3-9]\d{9}'):mobile>")
def sms(mobile):return f"发送短信给手机号:{mobile}的用户"@app.route("/goods/<re('\d+'):id>")
def goods(id):return f"显示商品id={id}的信息"if __name__ == '__main__':# 3. 运行flask提供的测试web服务器程序app.run(host="0.0.0.0", port=5000)

终端运行Flask项目

#  如果要基于开发环境在终端启动项目,设置环境变量如下:
export FLASK_DEBUG=True
# 如果要基于生产环境在终端启动项目,设置环境变量如下:
# export FLASK_DEBUG=Flase# 找到创建flask应用的模块路径,例如:manage.py
# 则ubuntu等Linux下的终端:
export FLASK_APP=manage.py  # 这是临时设置,如果有永久设置,可以通过/etc/profile保存
# 2. 在当前虚拟环境中,如果安装了flask模块,则可以使用全局命令flask run,即可运行flask项目
flask run # 采用默认的127.0.0.1 和 5000端口运行项目 
flask run --host=0.0.0.0 --port=8088 # 可以改绑定域名IP和端口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870625.shtml

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

相关文章

逐步实践复现 SELF-RAG

SELF-RAG 简介 SELF-RAG&#xff08;Self-Reflective Retrieval-Augmented Generation&#xff09;是一种检索增强生成&#xff08;RAG&#xff09;的框架&#xff0c;它通过自我反思学习检索、生成和批判&#xff0c;以提高大型语言模型&#xff08;LLM&#xff09;的质量和真…

通用业务指标管理系统设计

设计一个通用业务指标管理系统&#xff0c;旨在帮助企业全面监控和管理关键业绩指标(KPIs)&#xff0c;以驱动决策制定和业务优化。以下是一个综合性的设计方案&#xff0c;涵盖核心功能模块、技术架构、以及用户体验设计要点&#xff1a; 1. 核心功能模块 目标设定与分解 战…

「C++系列」一篇文章说透【存储类】

文章目录 一、C 存储类1. 类的定义2. 对象的创建3. 对象在内存中的布局4. 对象的存储位置 二、auto 存储类1. auto的基本用法2. auto与存储类的关系1) 自动存储类&#xff08;最常见的&#xff09;2) 静态存储类3) 动态存储类&#xff08;通过new&#xff09; 三、register 存储…

C标准库读写文件

函数介绍 库变量 变量描述size_t无符号整数类型&#xff0c;是sizeof关键字的结果&#xff0c;表示对象大小FILE文件流类型&#xff0c;适合存储文件流信息的对象类型 库宏 宏描述NULL空指针常量EOF表示已经到达文件结束的负整数stderr、stdin、stdout指向FILE类型的指针&a…

react 中useState 使用Immer 简化数据更改操作数组、对象

如果你不想改变你的状态结构&#xff0c;你可能更喜欢嵌套传播的捷径。Immer 是一个流行的库&#xff0c;它允许你使用方便但可变的语法进行编写&#xff0c;并负责为你生成副本。使用 Immer&#xff0c;你编写的代码看起来就像你是 “打破规则” 并且正在改变一个对象&#xf…

js【详解】声明常量和变量 const let var

声明常量 const 声明常量时&#xff0c;必须赋值&#xff01;声明的常量赋值后&#xff0c;不能修改&#xff08;运行时会报错&#xff09;ES6 新增语法有块级作用域 const webName EC编程俱乐部常量不可变的本质 常量赋值值类型数据后&#xff0c;不能再赋其他值&#xff0…

【数智化案例展】吉林省消防救援总队——基于大语言模型的119智慧助手

‍ 嘉诚信息案例 本项目案例由嘉诚信息投递并参与数据猿与上海大数据联盟联合推出的《2024中国数智化转型升级创新服务企业》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着信息时代的迅猛发展&#xff0c;消防人员正面临前所未有的知识爆炸挑战。为了高…

功能丰富的开源协作式知识库系统outline

语雀飞书平替快速协作式的团队知识库提供一个美观、易于使用的界面允许团队成员以实时方式协作编辑文档支持Markdown-i68爱六八,链接你我他&#xff1a;https://i68.ltd项目仓库&#xff1a;GitHub - outline/outline: The fastest knowledge base for growing teams. Beautifu…

day30--56. 合并区间+ 738.单调递增的数字

一、56. 合并区间 题目链接&#xff1a;https://leetcode.cn/problems/merge-intervals/ 文章讲解&#xff1a;https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wx4y157nD 1.1 初见思路 …

数据库第四次练习

数据准备 创建两张表&#xff1a;部门&#xff08;dept&#xff09;和员工&#xff08;emp&#xff09;&#xff0c;并插入数据&#xff0c;代码如下 create table dept( dept_id int primary key auto_increment comment 部门编号, dept_name char(20) comment 部门名称 ); in…

SAP PS学习笔记02 - 网络,活动,PS文本,PS文书(凭证),里程碑

上一章讲了PS 的概要&#xff0c;以及创建Project&#xff0c;创建WBS。 SAP PS学习笔记01 - PS概述&#xff0c;创建Project和WBS-CSDN博客 本章继续讲PS的后续内容。包括下面的概念和基本操作&#xff0c;以及一些Customize&#xff1a; - 网络&#xff08;Network&#xf…

力扣-回溯法

何为回溯法&#xff1f; 在搜索到某一节点的时候&#xff0c;如果我们发现目前的节点&#xff08;及其子节点&#xff09;并不是需求目标时&#xff0c;我们回退到原来的节点继续搜索&#xff0c;并且把在目前节点修改的状态还原。 记住两个小诀窍&#xff0c;一是按引用传状态…

copy 和 mutableCopy 有点乱

对 string literal (字符串字面量) 执行 copy 要打印指针指向对象的地址和指针本身的地址&#xff0c;可以使用 %p 格式符来输出指针地址。以下代码&#xff0c;展示了 originalString 和 copiedString 的指针地址和指向对象的地址&#xff1a; NSString *originalString &q…

使用 FFmpeg 处理视频:简介、常用命令及在 C++ 中调用 FFmpeg

文章目录 使用 FFmpeg 处理视频&#xff1a;简介、常用命令及在 C 中调用 FFmpeg一、FFmpeg 简介1. 什么是 FFmpeg&#xff1f;2. 主要特性3. 官方网站和文档 二、FFmpeg 常用命令1. 视频转码2. 提取音频3. 剪切视频4. 合并视频5. 调整分辨率6. 视频截图7. 推流8. 拉流 三、在 …

【Go系列】 array、slice 和 map

承上启下 我们上一篇文章中介绍了if和for&#xff0c;这不得练习下&#xff0c;让我们一起来实践一下如何使用 continue 语句来计算100以内的偶数之和。在我们编写代码的过程中&#xff0c;continue 语句将会帮助我们跳过某些不需要的迭代&#xff0c;比如在这个例子中&#xf…

欣奇随机美图源码

欣赏养眼美图让人心情愉悦 新增正能量进站引导首页 上传文件解压即可用有手就行 美图输出接口自判断版 http://mt.xqia.net/api.php http://mt.xqia.net/api.php?typejson 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89520368 更多资源下载&…

20240711每日消息队列-------------MQ消息的积压的折磨

目标 解决MQ消息的积压 背景 菜馆系统----------- 系统读取消息&#xff0c;处理业务逻辑&#xff0c;持久化订单和菜品数据&#xff0c;然后将其显示在菜品管理客户端上。 最初我们的用户基数很小&#xff0c;上线后的一段时间内&#xff0c;MQ消息通信还算顺利。 随着用户…

基于深度学习的视频内容分析

基于深度学习的视频内容分析是一种利用深度学习技术对视频数据进行处理和理解&#xff0c;以提取有用信息、识别对象和行为、检测事件和生成描述等的方法。这种技术在监控安全、视频搜索、自动驾驶、智能家居和娱乐等多个领域具有广泛应用。以下是关于这一领域的系统介绍&#…

java实现对多层json排序

1、概述 目的&#xff1a;对多层json排序&#xff0c;按字母的升序排序。实现方案&#xff1a;利用java中的TreeMap排序特性进行排序。 2、工具类 package com.ybw.util;import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject;import java.util.Map;…

(三)大模型/人工智能/机器学习/深度学习/NLP

一.模型 模型&#xff0c;简单来说&#xff0c;就是用来表示或解释某个事物、现象或系统的一种工具或框架。它可以是实体的&#xff0c;也可以是虚拟的&#xff0c;目的是为了帮助我们更好地理解和预测所描述的对象。在生活中&#xff0c;模型无处不在&#xff0c;它们以各种形…