Flask快速入门(路由、CBV、请求和响应、session)
Flask快速入门(路由、CBV、请求和响应、session)
目录
- Flask快速入门(路由、CBV、请求和响应、session)
- 安装
- 创建页面
- Debug模式
- 快速使用
- Werkzeug介绍
- watchdog介绍
- 快速体验
- 路由系统
- 源码分析
- 手动配置路由
- 动态路由-转换器
- Flask的CBV
- 快速使用
- cbv源码分析
- 请求和响应
- 请求对象(request)
- 响应对象
- Session
- 基本使用
- 原理解析
安装
pip install flask
创建页面
from flask import Flask# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)# 配置路由和视图函数的对应关系(基于装饰器)
@app.route("/")
def index():return "Hello World!"# 启动一个本地开发服务器,激活该网页
app.run()
# 或者:
# if __name__ == '__main__':
# app.run()
Debug模式
终端执行
if __name__ == '__main__':app.debug = Trueapp.run()
debug模式下:
- 自动重载 - 根据代码内容变化自动重启项目
- 终端展示错误提示
- 日志记录
快速使用
用route接受请求方式
@app.route("/", methods=['GET', 'POST'])
def index():return '你好'
直接调用请求方法
@app.get("/")
def index():return '你好'
Werkzeug介绍
Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库,它并没有和flask有直接联系,但是flask可以借助它执行各种Web操作,例如Request,Response
from werkzeug.wrappers import Request, Response@app.route("/")
def index():return Response('你好')
watchdog介绍
快速体验
当前目录下修改文件会被监控,并打印日志
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandlerif __name__ == "__main__":# 配置日志logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')path = sys.argv[1] if len(sys.argv) > 1 else '.'# 初始化监控类(文件的创建 删除...)event_handler = LoggingEventHandler()# 初始化监控类observer = Observer()# 配置 observer 以使用 event_handler 来处理 path 路径下的事件,并递归地监控该路径下的所有子目录(由于 recursive=True)observer.schedule(event_handler, path, recursive=True)# 启动监控observer.start()try:while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()
路由系统
源码分析
@app.route('/',methods=['GET'])
直接Ctrl左键进入route
@setupmethod
def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]:# 将视图函数作为参数执行了add_url_ruledef decorator(f: T_route) -> T_route:endpoint = options.pop("endpoint", None)self.add_url_rule(rule, endpoint, f, **options)return freturn decorator
该注释的意思是,当有给定的url规则来注册该视图函数时,将会触发该装饰器,且装饰器会执行add_url_rule
方法,因此我们只需要搞明白add_url_rule
做了什么
@setupmethod
def add_url_rule(self,rule: str,endpoint: str | None = None,view_func: ft.RouteCallable | None = None,provide_automatic_options: bool | None = None,**options: t.Any,
) -> None:
- rule:定义路由的字符串,例如
'/'
、'/login'
- endpoint:当URL中无参数,函数需要参数时,使用defaults = {‘k’: ‘v’}-为函数提供参数,django中也有,叫kwargs,默认为None
- view_func:视图函数的名称,也就是源码中的f
- provide_automatic_options: 一个布尔值,用于控制是否应该自动为路由添加一个 OPTIONS 方法的处理器。如果为
None
,则使用应用配置的ADD_AUTOMATIC_OPTIONS
值 - options: 一个可变参数,用于传递额外的选项给路由。这些选项可以包括用于路由的各种配置,如 HTTP 方法的集合(
methods
)
手动配置路由
知晓了路由原理后我们就可以不用装饰器自定义路由
def login():return '我是login'app.add_url_rule('/login', endpoint=None, view_func=login, methods=['GET', 'POST'])
动态路由-转换器
大致与Django同理
# 转换器
app.add_url_rule('/index/<int:pk>')
pk值是一个int类型的任意参数,除此之外还有其他类型参数:
DEFAULT_CONVERTERS = {'default': UnicodeConverter,'string': UnicodeConverter,'any': AnyConverter,'path': PathConverter,'int': IntegerConverter,'float': FloatConverter,'uuid': UUIDConverter,
}
Flask的CBV
CBV(Class-Based Views)指的是基于类的视图编写方式
快速使用
from flask import Flask, url_for
from flask.views import MethodViewapp = Flask(__name__)
app.debug = Trueclass IndexView(MethodView):def get(self):return 'get请求'def post(self):return 'post请求'# name可以理解为别名
app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))if __name__ == '__main__':app.run()# CBV也可以使用路由装饰器:
# @route('/index')
# class IndexView(MethodView):
即传了endpoint,又传了name,以谁为准?
- 如果传了endpoint,以endpoint 为准
如果没传,以函数名为准,函数名是view,但是被name改了,所以以name为准
cbv源码分析
class View:methods: t.ClassVar[t.Collection[str] | None] = Noneprovide_automatic_options: t.ClassVar[bool | None] = Nonedecorators: t.ClassVar[list[t.Callable[[F], F]]] = []init_every_request: t.ClassVar[bool] = Truedef dispatch_request(self) -> ft.ResponseReturnValue:raise NotImplementedError()@classmethoddef as_view(cls, name: str, *class_args: t.Any, **class_kwargs: t.Any) -> ft.RouteCallable:if cls.init_every_request:def view(**kwargs: t.Any) -> ft.ResponseReturnValue:self = view.view_class( # type: ignore[attr-defined]*class_args, **class_kwargs)# 这里其实就是return self.dispatch_request(**kwargs)return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return]else:self = cls(*class_args, **class_kwargs)def view(**kwargs: t.Any) -> ft.ResponseReturnValue:return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return]if cls.decorators:# 将view的名字改为传入的name 否则一直叫viewview.__name__ = nameview.__module__ = cls.__module__for decorator in cls.decorators:view = decorator(view)view.view_class = cls # type: ignoreview.__name__ = nameview.__doc__ = cls.__doc__view.__module__ = cls.__module__view.methods = cls.methods # type: ignoreview.provide_automatic_options = cls.provide_automatic_options # type: ignorereturn view
- 每当有请求过来时执行view(),执行view的本质就是执行dispatch_request(),self就是我们定义的视图类对象
请求和响应
请求对象(request)
from flask import Flask, request
响应对象
make_response生成的响应对象可以存放字符串、模板、重定向、json
from flask import Flask, render_template, make_responseclass ContactView(MethodView):def get(self):res = make_response('get请求')res.set_cookie('name', '<NAME>', path='/contact')return res
- 可以对响应对象添加cookie,path的意思是只有path指定的路径会存储cookie,浏览其他页面不会携带cookie
Session
基本使用
# 配置secret_key 自定义的字符串
app.secret_key = 'abcdefg'
- 增:
session['name'] = '张三'
- 删:
session.pop('name')
- 清:
session.clear()
- 取:
name = session.get('name')
原理解析
- 存储或修改session时
- 对session进行加密(三段式)
- 存储到cookie(obj.set_cookie)
- 校验session时
- 根据session取出cookie
- 将第二段反解放入session中
源码:
# open_session
def open_session(self, app: Flask, request: Request) -> SecureCookieSession | None:s = self.get_signing_serializer(app)if s is None:return Noneval = request.cookies.get(self.get_cookie_name(app))if not val:return self.session_class()max_age = int(app.permanent_session_lifetime.total_seconds())try:data = s.loads(val, max_age=max_age)return self.session_class(data)except BadSignature:return self.session_class()# save_session
def save_session(self, app: Flask, session: SessionMixin, response: Response) -> None:name = self.get_cookie_name(app)domain = self.get_cookie_domain(app)path = self.get_cookie_path(app)secure = self.get_cookie_secure(app)samesite = self.get_cookie_samesite(app)httponly = self.get_cookie_httponly(app)# Add a "Vary: Cookie" header if the session was accessed at all.if session.accessed:response.vary.add("Cookie")# If the session is modified to be empty, remove the cookie.# If the session is empty, return without setting the cookie.if not session:if session.modified:response.delete_cookie(name,domain=domain,path=path,secure=secure,samesite=samesite,httponly=httponly,)response.vary.add("Cookie")returnif not self.should_set_cookie(app, session):returnexpires = self.get_expiration_time(app, session)val = self.get_signing_serializer(app).dumps(dict(session)) # type: ignoreresponse.set_cookie(name,val, # type: ignoreexpires=expires,httponly=httponly,domain=domain,path=path,secure=secure,samesite=samesite,)response.vary.add("Cookie")
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/119b7a1296c2715ae20c3f2492ac2fe9.png)
Flask快速入门(路由、CBV、请求和响应、session)
Flask快速入门(路由、CBV、请求和响应、session) 目录 Flask快速入门(路由、CBV、请求和响应、session)安装创建页面Debug模式快速使用Werkzeug介绍watchdog介绍快速体验 路由系统源码分析手动配置路由动态路由-转换器 Flask的CBV…...
![](https://img-blog.csdnimg.cn/direct/f145001014864c6ea5915d6224a43194.png)
人工智能指数报告
2024人工智能指数报告(一):研发 前言 全面分析人工智能的发展现状。 从2017年开始,斯坦福大学人工智能研究所(HAI)每年都会发布一份人工智能的研究报告,人工智能指数报告(AII&…...
![](https://img-blog.csdnimg.cn/img_convert/248e4474d5527f5e31e83d4bcd4b966e.jpeg)
聊聊 Mybatis 动态 SQL
这篇文章,我们聊聊 Mybatis 动态 SQL ,以及我对于编程技巧的几点思考 ,希望对大家有所启发。 1 什么是 Mybatis 动态SQL 如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼…...
![](https://img-blog.csdnimg.cn/direct/fb597a3fea6346bebec989a512e0b0fe.gif)
【windows|004】BIOS 介绍及不同品牌电脑和服务器进入BIOS设置的方法
🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专家博主 💊交流社…...
![](https://img-blog.csdnimg.cn/direct/0262b6d404584db4846ea83c57b9ea52.png)
lvgl的应用:移植MusicPlayer(基于STM32F407)
目录 概述 1 软硬件环境 1.1 UI开发版本 1.2 MCU开发环境 1.3 注意点 2 GUI Guider开发UI 2.1 使用GUI Guider创建UI 2.2 GUI Guider编译项目和测试 2.2.1 GUI Guider编译项目 2.2.2 编译 2.3 了解GUI Guider生成代码 3 移植项目 3.1 Keil中加载代码 3.2 调用G…...
![](https://img-blog.csdnimg.cn/direct/1c52da33d1464ed0b149f03baee289c9.jpeg)
Hadoop3:MapReduce中的Shuffle机制
一、流程图 Shuffle是Map方法之后,Reduce方法之前的数据处理过程称。 二、图解说明 1、数据流向 map方法中context.write(outK, outV);开始,写入环形缓冲区,再进行分区排序,写到磁盘 reduce方法拉取磁盘上的数据,…...
![](https://img-blog.csdnimg.cn/direct/8fc86d5e56cb4c33a4a7ba96cb9abed4.png)
从设计到实践:高速公路监控技术架构全剖析
随着高速公路网络的迅速扩展和交通流量的日益增加,高效的监控系统成为保障交通安全、提升管理效率的重要手段。本文将深入探讨高速公路监控技术架构,从设计理念到实际应用,全面解析这一关键技术的各个环节。 ### 一、系统设计理念 #### 1. 高…...
![](https://www.ngui.cc/images/no-images.jpg)
Go Context
Context 介绍 Context 代表了协程的上下文,用以在父子协程之间传递控制信号,共享变量等操作// context.Context 接口 type Context interface {// 当Context自动取消或者到了取消时间被取消后返回Deadline() (deadline time.Time, ok bool)// 当Contex…...
![](https://img-blog.csdnimg.cn/direct/ac8062a8fc3b415b88880a1a8c72b4d0.png)
centOS Stream9配置NAT8网络
首先将VMware关机,添加网络适配器 启动虚拟机,查看ens192是否打开连接 安装的图形化需要查看右上角电源处网卡是否连接 最小化安装一般不会出现未连接的状态 使用ip a 查看 配置网卡文件 cd /etc/NetworkManager/system-connections/cd到当前目录下…...
![](https://img-blog.csdnimg.cn/direct/cde8f0a0a6b645f8b78d3afd168ad20a.png)
Linux - 进程
一、什么是进程 首先,Linux是一个多用户多进程的操作系统,系统上可以同时运行多个进程。 进程的产生:①是在执行程序或者命令时产生的;②定时任务进程 进程的类型:前台进程/后台进程 前台进程:一个终端…...
![](https://img-blog.csdnimg.cn/direct/12dc4d83d10440dcb3bac995b7517e82.png)
nginx+tomcat负载均衡、动静分离群集【☆☆☆☆☆】
Nginx是一款非常优秀的HTTP服务器软件,性能比tomcat更优秀,它支持高达50 000个并发连接数,拥有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。目前很多大型网站都应用Nginx服务器作为后端网站程序的…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL容器部署步骤
1、拉取MySQL镜像 docker pull mysql # 默认拉取最新版本docker pull mysql:5.7 # 拉取5.7版本docker pull mysql:8.0 # 拉取8.0版本 2、创建挂载目录 # 创建挂载目录 mkdir -p /home/mysql/conf/ # -p: 多级创建mkdir -p /home/mysql/log/mkdir -p /home/mysql/data/ 3…...
![](https://img-blog.csdnimg.cn/direct/4c59f9a151e941c3b2030ac8c03bdb37.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_96,text_5rqQ5Luj56CB4oCi5a64,size_16,color_FFFFFF,t_70)
在 Ubuntu 18.04.4 LTS上安装 netmap
文章目录 步骤运行配置文件编译安装使用netmap 步骤 sudo su sudo apt-get update sudo apt install build-essential sudo apt-get install -y git sudo apt-get install -y linux-headers-$(uname -r)rootVM-20-6-ubuntu:/home/ubuntu/netmap/LINUX# git clone https://gith…...
![](https://img-blog.csdnimg.cn/direct/254c5d5daf4349a4aef1349f3d3bb0b8.png)
spark 整合 yarn
spark 整合 yarn 1、在master节点上停止spark集群 cd /usr/local/soft/spark-2.4.5/sbin ./stop-all.sh 2、spark整合yarn只需要在一个节点整合, 可以删除node1 和node2中所有的spark文件 分别在node1、node2 的/usr/local/soft目录运行 rm -rf spark-2.4.…...
![](https://www.ngui.cc/images/no-images.jpg)
蓝桥杯十五届国赛模拟题1答案
1、bug缺陷报告 功能名称缺陷描述操作步骤预期结果实际结果缺陷级别销售订单列表...
![](https://img-blog.csdnimg.cn/direct/9918154f50a14d169b438cafe74da5da.png)
分布式之日志系统平台ELK
ELK解决了什么问题 我们开发完成后发布到线上的项目出现问题时(中小型公司),我们可能需要获取服务器中的日志文件进行定位分析问题。但在规模较大或者更加复杂的分布式场景下就显得力不从心。因此急需通过集中化的日志管理,将所有服务器上的日志进行收集汇总。所以ELK应运而生…...
![](https://www.ngui.cc/images/no-images.jpg)
git常见错误
refusing to merge unrelated histories 如果git merge合并的时候出现refusing to merge unrelated histories的错误,原因是两个仓库不同而导致的,需要在后面加上--allow-unrelated-histories进行允许合并,即可解决问题。 git push origin …...
![](https://img-blog.csdnimg.cn/direct/d71cfaf2257f476a8d7343164fc5ec06.jpeg)
构建稳定高效的消息传递中间件:消息队列系统的设计与实现
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 一、引言 二、设计目标 2.1、高可用性 1. 集群搭建 1.1 …...
![](https://img-blog.csdnimg.cn/direct/6477c0e620834d1881e3c7322831b559.png)
支持 MKV、MP4、AVI、MPG 等格式视频转码器
一、简介 1、一款开源的视频转码器,适用于 Linux、Mac 和 Windows。它是一个免费的工具,由志愿者们开发,可以将几乎所有格式的视频转换为现代、广泛支持的编码格式。你可以在官网上下载该应用或源代码。该软件支持 MKV、MP4、AVI、MPG 等格式…...
![](https://www.ngui.cc/images/no-images.jpg)
yum
文章目录 本地源配置本地yum源仓库yum常用的操作命令 网络源阿里云当yum 安装源代码软件包需要编译安装,需要安装支持c和c程序语言的编译器,如gcc、gcc-c、make 如果使用rpm方式安装,则需要先安装多个依赖包,这样会很繁琐。可以使…...
![](https://img-blog.csdnimg.cn/direct/9f608207f5c44c24b0071bc3d7d1b6bd.png)
【单片机毕业设计选题24016】-基于STM32和阿里云的采空区环境监测系统设计
系统功能: 系统分为主机端和从机端,主机端主动向从机端发送信息和命令,从机端 收到主机端的信息后回复温度,甲烷,一氧化碳,氧气和系统状态等信息。 同时主机端将这些信息上传至阿里云服务器。 主要功能模块原理图: 电源时钟烧…...
![](https://img-blog.csdnimg.cn/direct/daa3cbbaad324a93b176f43e52ec8035.png)
Leetcode3179. K 秒后第 N 个元素的值
Every day a Leetcode 题目来源:3179. K 秒后第 N 个元素的值 解法1:模拟 模拟 k 轮,数组保存上一次结果,然后计算当前轮次的结果。 代码: /** lc appleetcode.cn id3179 langcpp** [3179] K 秒后第 N 个元素的值…...
![](https://www.ngui.cc/images/no-images.jpg)
vue3第二阶段的开发文档
1 2.1 案例——学习计划表 2.1.1 准备工作 在开发“学习计划表”案例之前,需要先完成一些准备工作,具体步骤如下。 ① 打开命令提示符,切换到 D:\vue\chapter02 目录,在该目录下执行如下命令,创建 项目。 np…...
![](https://img-blog.csdnimg.cn/direct/05edfdee475942f784ef2448923178ca.png#pic_center)
【网络安全学习】漏洞扫描:- 02- nmap漏洞扫描
1.nmap的介绍 Nmap是一款功能强大的网络探测和安全扫描工具,可以对目标进行端口扫描、服务探测、操作系统指纹识别等操作。 Nmap自带了许多内置的NSE脚本,它们可以根据不同的目标和场景来执行不同的功能。这些脚本存放在Nmap安装目录**/usr/share/nmap…...
![](https://www.ngui.cc/images/no-images.jpg)
Web开发技能树-HTML-class/id/name/tag
1 需求 需求1:CSS查找HTML元素 *tagclassid派生选择器 需求2:JavaScript查找HTML元素 通过id找到HTML元素:document.getElementById()通过标签名找到HTML元素:getElementsByTagName()通过类名找到HTML元素:document.getElemen…...
![](https://img-blog.csdnimg.cn/img_convert/0464b1008f83b59f67e39909cb08ef38.jpeg)
据APO Research(阿谱尔)统计,2023年全球乳酸企业产能约119.3万吨
乳酸又称 2-羟基丙酸,一种天然有机酸,分子式是 C3H6O3。是自然界中最为广泛存在的羟基酸,于 1780 年被瑞典科学家 Scheele 首次发现。乳酸是自然界最小的手性分子,以两种立体异构体的形式存在于自然界中,即左旋型 L-乳…...
![](https://img-blog.csdnimg.cn/direct/de6c91ebc4a5446a82e866deb0dbe61c.png)
百度文心智能体平台(想象即现实):轻松上手,开启智能新时代!创建属于自己的智能体应用。
目录 1.1、文心智能体平台 1.2、创建智能体 1.3、智能体报名入口 1.4、古诗词小助手 1.5、访问我的智能体 在这个全新的时代里,人工智能技术正以前所未有的速度发展,渗透到我们生活的方方面面。无论是智能家居、自动驾驶,还是医疗诊断、…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux中ls -lsa 和ls -lst区别
在Linux中,ls 命令用于列出目录内容。当与不同的选项组合时,它可以以不同的方式显示文件和目录的详细信息。 对于 ls -lsa 和 ls -lst,它们的主要区别在于显示的列和排序方式: ls -lsa: -l: 使用长格式显示文件和目录的详细信息。…...
![](https://www.ngui.cc/images/no-images.jpg)
TDengine 签约上海晶澳太阳能,助力储能业务平台搭建
在全球能源结构转型和碳中和目标的大背景下,太阳能作为清洁能源的重要组成部分,正逐渐成为新能源发展的关键。作为一个领先的数据处理平台,TDengine 最近与太阳能行业的领头羊晶澳太阳能科技股份有限公司开展了深度合作。这项合作旨在利用 TD…...
![](https://img-blog.csdnimg.cn/direct/818581a5b6214156b22a260492b8825d.png)
【数据结构】选择题
在数据结构中,从逻辑上可以把数据结构分为(线性结构和非线性结构) 当输入规模为n时,下列算法渐进复杂性中最低的是() 时间复杂度 某线性表采用顺序存储结构,每个元素占4个存储单元…...
![](/images/no-images.jpg)
宣传 网站建设/公司网络推广的作用
同步是通信系统中一个十分重要的实际问题。通信系统能够有效、可靠的工作,很大程度上取决于有无良好的同步系统。AIS系统中重要的同步有以下几种。 一、UTC同步 世界协调时(UTC)同步是航海领域中非常关键的技术。在AIS系统中,站台…...
![](/images/no-images.jpg)
建设网站内容的策划书/百度链接收录
在棋盘(N*N)上放置N个皇后,使他们互不攻击,此时每个皇后的 攻击范围为 同行同列同对角线要求找出所有解 恰好每行每列放置一个皇后 如果用C[x]表示第x行皇后的列号,就成为了一个全排列问题 static int ans;static i…...
![](https://img-blog.csdnimg.cn/img_convert/b65624db5f9d538c292958e73e229a94.png)
绍兴市高速公路建设指挥部网站/今日头条新闻手机版
1 SWUpdata 概述 SWUpdata 是一个开源项目,该项目可以从存储介质或网络为嵌入式设备更新嵌入式系统。但是,它应该主要被视为一个框架,可以轻松地将更多协议或安装程序(在 SWUpdate 中称为处理程序)添加到应用程序中。 …...
帮一个公司做网站多少钱/超级优化
目前,信息流短视频排序是基于CTR预估Wide&Deep深层模型。在Wide&Deep模型基础上做一系列相关优化,包括相关性与体感信号引入、多场景样本融合、多模态学习、树模型等,均取得不错收益。 总体上,短视频模型优化可分为两部分…...
![](http://www.oh100.com/pic/original/allimg/201704/36-1f406150512.jpg)
广州设计公司网站/品牌形象推广
2017全国计算机等级考试一级WPS office考试大纲NCRE(WPS Office)是全国计算机等级考试体系(NCRE)的入门级。下面是YJBYS小编整理的2017全国计算机等级考试一级WPS office考试大纲,希望对你有帮助!考试大纲:1.具有使用微型计算机的基础知识(包…...
![](https://img-blog.csdnimg.cn/img_convert/fe652013cab560edc6078cc5db0d2c93.png)
wordpress更换新主题/国内真正的免费建站
在实际引用的场景中,经常会有这样一种情况,客户那边由于网络或者安全考虑需要内网操作,没有对应的网络环境,进行项目创建和引用添加都只能通过离线的方式添加,那么如何离线安装AR对应的引用? 点击获取Acti…...