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

image-20240612154416089

该注释的意思是,当有给定的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'])

image-20240612161318162

动态路由-转换器

大致与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")

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

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

相关文章

meilisearch的索引(index)的最佳实践

官网的第一手资料学新技术&#xff1a;meilisearch官方文档 安装的官网地址&#xff1a;meilisearch安装的官网 部署在生产环境的指导&#xff1a;meilisearch部署在生产环境的指导 Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重…

CentOS系统自带Python2无法使用pip命令

Linux运维工具-ywtool 目录 一. 系统环境二.解决三.验证四.备注(1)输入"yum install -y python-pip",提示没有可用 python-pip包(2)安装完pip后进行升级 一. 系统环境 centos7系统自带的python2.7无法使用pip命令 二.解决 yum install python-pip -y三.验证 pip…

Roboflow 图片分类打标

今天准备找个图片标注工具&#xff0c;在网上搜了一下&#xff0c;看 Yolo 的视频中都是用 Roboflow 工具去尝试了一下&#xff0c;标注确实挺好用的&#xff0c;可以先用一些图片训练一个模型&#xff0c;随后用模型进行智能标注。我主要是做标注然后到处到本地进行模型的训练…

上心师傅的思路分享(三)--Nacos渗透

目录 1. 前言 2. Nacos 2.1 Nacos介绍 2.2 鹰图语法 2.3 fofa语法 2.3 漏洞列表 未授权API接口漏洞 3 环境搭建 3.1 方式一: 3.2 方式二: 3.3 访问方式 4. 工具监测 5. 漏洞复现 5.1 弱口令 5.2 未授权接口 5.3.1 用户信息 API 5.3.2 集群信息 API 5.3.3 配置…

借力AI,助力网络钓鱼(邮件)检测

引言 互联网时代&#xff0c;邮件系统依然是人们工作、生活中的很重要的一部分&#xff0c;与此同时&#xff0c;邮件系统的发展带来的钓鱼邮件问题也成为网络中的最大的安全隐患之一。本文将为大家解开网络钓鱼&#xff08;邮件&#xff09;的神秘面纱&#xff0c;一探究竟&a…

和利时DCS数据采集对接安监平台

在工业互联网日益繁荣的今天&#xff0c;工业数据的采集、传输与利用变得至关重要。特别是在工业自动化领域&#xff0c;数据的实时性和准确性直接关系到生产效率和安全性。和利时DCS&#xff08;分布式控制系统&#xff09;以其卓越的稳定性和可靠性&#xff0c;在工业自动化领…

Ubuntu 24.04 屏蔽snap包

Ubuntu 24.04 屏蔽snap包 屏蔽 这里所说的屏蔽指的是&#xff1a;禁止sudo apt install firefox时安装snap版本的包。 如需卸载snap&#xff0c;请使用关键词搜索。 命令行 cat <<EOF | sudo tee /etc/apt/preferences.d/snap-apps-disable Package: chromium* firef…

yg校园易购电商系统(Go+Vue)

校园易购二手平台系统 GitHub项目地址&#xff1a;https://github.com/xzhHas/yg 文章目录 校园易购二手平台系统一、技术栈简介二、快速开始1、安装本系统使用到的插件&#xff0c;这里推荐使用docker安装&#xff0c;此操作皆在ubuntu系统下操作&#xff0c;如果是其他系统只…

学习笔记——网络管理与运维——概述(网络管理)

二、概述 1、什么是网络管理&#xff1f; 网络管理是通过对网络中设备的管理&#xff0c;保证设备工作正常&#xff0c;使通信网络正常地运行&#xff0c;以提供高效、可靠和安全的通信服务&#xff0c;是通信网络生命周期中的重要一环。 2、网络管理分类 网络管理(Network …

【代码随想录算法训练营第三十五天】 | 1005.K次取反后最大化的数组和 134.加油站 135.分发糖果

贪心章节的题目&#xff0c;做不出来看题解的时候&#xff0c;千万别有 “为什么这都没想到” 的感觉&#xff0c;想不出来是正常的&#xff0c;转变心态 “妙啊&#xff0c;又学到了新的思路” &#xff0c;这样能避免消极的心态对做题效率的影响。 134. 加油站 按卡哥的思路…

redis 06 集群

1.节点&#xff0c;这里是把节点加到集群中的操作&#xff0c;跟主从结构不同 这里是在服务端使用命令&#xff1a; 例子&#xff1a; 2.启动节点 节点服务器 首先&#xff0c;先是服务器节点自身有一个属性来判断是不是可以使用节点功能 一般加入集群中的节点还是用r…

【Spine学习06】之IK约束绑定,制作人物待机动画,图表塞贝尔曲线优化动作

引入IK约束的概念&#xff1a; 约束目标父级 被约束骨骼子集 这样理解更好&#xff0c;约束目标可以控制被约束的两个骨骼运作 IK约束绑定过程中呢&#xff0c;如果直接绑定最下面的脚掌骨骼会发生偏移&#xff0c;所以在开始处理IK之前&#xff0c;需要先设置一个ROOT结点下的…

创新入门|生成式AI创新赋能优势解析,获取生成式AI知识的10大方法

生成式AI技术对员工和企业影响深远。对于员工而言&#xff0c;生成式AI能够提升工作效率&#xff0c;简化重复性任务&#xff0c;并为创意和决策提供支持。对于企业而言&#xff0c;生成式AI在产品创新、市场营销、客户服务和运营优化等方面发挥重要作用&#xff0c;帮助预测市…

OpenHarmony napi 编译 .so 并打包成 .har

一、前言 最近在搞公司标准产品适配OpenHarmony 平台&#xff0c; 按照行业上的常用方法&#xff0c;在Android 是将底层代码用c 封装成 xxx.so &#xff0c;然后将其他一部分打包成 xxx.jar。 因此&#xff0c;在OpenHarmony 平台也是打算按照这个模式。正所谓&#xff0c;好…

JavaScript之函数

函数 使用 声明语法&#xff1a; function 函数名() {函数体 }命名规范&#xff1a; 小驼峰命名法前缀用动词 前缀词&#xff1a; 调用 函数名()函数传参 为了提高函数的灵活性 声明语法&#xff1a; function 函数名(参数列表) {函数体 }调用 函数名(参数)在函数声…

Python版本管理器-Miniconda

随着Python的版本更新&#xff0c;我们在开发Python软件的时候&#xff0c;对Python的版本选择越来越重要&#xff0c;但同时又要兼容已经开发好了的Python软件&#xff0c;因此选择一款合适的Python版本管理器对提高开发效率也越来越重要&#xff0c;今天就推荐一款Python的版…

深入理解指针(二)

目录 1. 数组名的理解 2. 使用指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟二维数组 1. 数组名的理解 有下面一段代码: #include <stdio.h> int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[…

2024年6月14日 十二生肖 今日运势

小运播报&#xff1a;2024年6月14日&#xff0c;星期五&#xff0c;农历五月初九 &#xff08;甲辰年庚午月己酉日&#xff09;&#xff0c;法定工作日。今天世界献血日&#xff0c;捐献新鲜血液&#xff0c;挽救更多生命&#xff0c;每位献血者都是英雄&#xff01; 红榜生肖…

美创科技入选“2024网络安全提供商创新排行榜”

近日&#xff0c;DBC德本咨询公布了“2024网络安全提供商创新排行榜”&#xff0c;美创科技凭借近20年的数据安全创新耕耘&#xff0c;荣誉上榜。 此次&#xff0c;与360、华为、腾讯等互联网、网络安全头部厂商并肩上榜&#xff0c;是行业对美创的再次认可。 数据安全的发展离…

什么是基于风险的漏洞管理RBVM,及其优势

文章目录 一、什么是漏洞管理二、什么是基于风险的漏洞管理RBVM三、RBVM的基本流程四、RBVM的特点和优势 一、什么是漏洞管理 安全漏洞是网络或网络资产的结构、功能或实现中的任何缺陷或弱点&#xff0c;黑客可以利用这些缺陷或弱点发起网络攻击&#xff0c;获得对系统或数据…