flask请求与响应、session执行流程

news2024/10/7 4:26:01

目录

请求对象

响应对象

session的使用和原理

闪现(flash)

请求扩展

蓝图


请求对象

请求对象request是全局的,需要导入这个全局的request,在哪个视图函数中就是当次的request对象

请求数据:

request.method        # 获取提交的方法
request.args          # 获取get请求提交的暑假
request.form          # 获取post请求提交的数据
request.values        # post和get提交的数据总和
request.cookies       # 客户端所带的cookie
request.headers       # 获取请求头
request.path          # 不带域名,请求路径
request.full_path     # 不带域名,带参数的请求路径
request.url           # 带域名带参数的请求路径
request.host_url      # 请求URL方案和主机
request.files         # 文件上传数据
request.data          # 二进制的请求数据 上传json格式

响应对象

response对象四件套

render_template  # 返回模板
redirect         # 重定向
jsonify          # 返回json格式数据
''               # 返回字符串类型

响应头中加参数:

有时候视图不返回响应对象时但可以返回Flask本身转换为响应对象的值,因此为其添加首部变得棘手。可以调用这个函数而不是使用return,你将得到一个响应对象,你可以使用它来附加header

flask.make_response(*args)
from flask import Flask, make_response, render_template

app = Flask(__name__)

@app.route('/')
def index():
    res = 'helloe'
    res = make_response(res)
    res.headers['name'] = 'abc'
    return res

将cookie写入

@app.route('/')
def index():
    res = make_response('ok')
    res.set_cookie('name', 'abc')
    # res.delete_cookie('name')
    return res

'''
set_cookie()参数

key      # 要设置的cookie的键(名称)。
value    # cookie的值。
max_age  # 应该以秒为单位,或者None(默认值),如果cookie只在客户端浏览器会话期间存在。
expires  # 应该是一个datetime对象或UNIX时间戳。
path     # 将cookie限制在给定路径下,默认情况下它将跨越整个域。
domain   # 如果要设置跨域cookie。例如,domain=".example.com"将设置一个cookie,该cookie可由域名www.example.com、foo.example.com等读取。否则,cookie只能由设置它的域读取。
secure   # 如果为True, cookie只能通过HTTPS访问。
httponly # 禁止JavaScript访问cookie。
samesite # 将cookie的作用域限制为仅附加给“same-site”请求。
'''

前后端分离和混合的cookie

\bullet 前后端混合,cookie是后端写入的

        - res.set_cookie("","") 混合通过这样写浏览器就能把cookie保存到cookie中

        - 本质是后端把cookie放到响应头中,浏览器读到响应头中有cookie把cookie写入到浏览器中

\bullet 前后端分裂

        - 直接把客户端要存到cookie中的数据,放到响应体中

        - 前端(浏览器,app,小程序),自己取出来放到相应的位置

                浏览器使用js自己写入到cookie,app自己使用代码写入到某个位置

session的使用和原理

在django中session的使用,举例在视图类中:

from django.http import HttpResponse


def login(request):
    request.session['name'] = 'abc'
    return HttpResponse('ok')


def permissions(request):
    if request.session.get('name'):
        return HttpResponse('允许')
    return HttpResponse('不允许')

使用和原理图:

 在flask中session的使用

from flask import Flask, session

app = Flask(__name__)

app.debug = True
app.secret_key = 'asdfghjk'


@app.route('/login')
def login():
    # 设置值
    session['name'] = 'abc'
    return 'ok'


@app.route('/show')
def permissions():
    # 获取值
    session.get('name')
    return 'ok'


if __name__ == '__main__':
    app.run()

flask的session执行流程源码分析:

请求来了会先执行app()

 def wsgi_app(self, environ, start_response):
    ctx = self.request_context(environ)
    try:
        try:
            ctx.push() # 它的源码
            response = self.full_dispatch_request()
        except Exception as e:
            error = e
            response = self.handle_exception(e)
        except: 
            error = sys.exc_info()[1]
            raise
        return response(environ, start_response)
    finally:
        ctx.pop(error)

执行ctx.push()

# ctx.push 的 373行左右	
    if self.session is None:
        session_interface = self.app.session_interface
        self.session = session_interface.open_session(self.app, self.request)
        if self.session is None:
            self.session = session_interface.make_null_session(self.app)

请求来了执行 session_interface.open_session

def open_session(
    self, app: "Flask", request: "Request"
) -> t.Optional[SecureCookieSession]:
    s = self.get_signing_serializer(app)
    if s is None:
        return None
    # val 就是从cookie中取出的三段,反序列化解密保存到session中
    val = 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, session, response):
    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)

    if not session:  # 如果视图函数放了,不为空 session['name']='abc'
        if session.modified:  # 
            response.delete_cookie(
                name,
                domain=domain,
                path=path,
                secure=secure,
                samesite=samesite,
                httponly=httponly,
            )
        return

  
    if session.accessed:
        response.vary.add("Cookie")

    if not self.should_set_cookie(app, session):
        return

    expires = self.get_expiration_time(app, session)
    # 序列化---》加密了
    val = self.get_signing_serializer(app).dumps(dict(session))  # type: ignore
    # 三段:
    response.set_cookie(
        name, # session
        val,  # 三段:
        expires=expires,
        httponly=httponly,
        domain=domain,
        path=path,
        secure=secure,
        samesite=samesite,
    )

总结:session执行流程

1.请求来的时候会执行open_session,取出cookie判断是否为空,如果不为空把它反序列化、解密转成字典,然后放到session对象中

2.请求走的时候会执行save_session,把session转成字典序列化加密成三段放到cookie中

闪现(flash)

作用:当访问a页面的时候出了错重定向到b页面,要在b页面渲染a页面的错误信息;在某个请求中放入值,另一个请求中取出,取出后就没了

from flask import flash, Flask, get_flashed_messages

app = Flask(__name__)
app.secret_key = 'asdfghjkl'


@app.route('/index')
def index():
    flash(message='闪现')
    # 还可以指定分类
    # flash(message='橘子', category='1')
    # flash(message='苹果', category='1')
    # flash(message='猪肉', category='2')
    # flash(message='羊肉', category='2')
    return 'index'


@app.route('/home')
def home():
    # 取出列表
    res = get_flashed_messages()
    print(res)  # ['闪现']
    # res = get_flashed_messages(category_filter=('1',))
    # ['橘子', '苹果']
    return 'home'


if __name__ == '__main__':
    app.run()

请求扩展

在请求进入视图函数之前执行的一些代码与请求出了视图函数之后执行的一些代码,类似于django的中间件完成的功能

1 before_request:在请求进视图函数之前执行
	- 有多个,从上往下依次执行。
	- 如果返回了response对象,就直接返回。
2 after_request:在请求从视图函数走之后执行
	- 有多个,从下往上依次执行。
	- 要参数和返回值
3 before_first_request:项目启动后,第一次访问会执行,以后再也不执行了
	- 项目启动后初始化
4 teardown_request:每一个请求之后绑定一个函数,即使遇到了异常,每个请求走,都会执行,记录错误日志
5 errorhandler路径不存在时404,服务器内部错误500
6 template_global 标签 ,在模板中用  {{ 标签() }}
7 template_filter过滤器  在模板中用  {{参数1 | 过滤器(参数2, 参数3)}}

蓝图

blueprint:对目录进行划分,因为之前的flask代码都是一个一个的py文件后期我们肯定需要划分一下文件,蓝图就是用来划分目录的(划分目录没有固定的模版,只要结构划分清楚就可以)

小型项目:

flask_blueprint_little   # 项目名
    - src  # 项目源代码
        - __init__  # app对象创建的地方
		- templates  # 模板
            - home.html
        - static # 静态文件
		    - views  # 视图函数存放位置
		        - user.py  # 用户相关视图
			    - login.py  # 登陆相关视图
    - settings.py  # 配置文件
    - manage.py  # 启动文件

大型项目:

flask_blurprint_big   # 项目名字
	-src   # 项目代码所在位置
    	-__init__.py # src的init,falsk,app实例化
        -settings.py # 配置文件
    	-admin       # 类似于django的admin app
        	-__init__.py # 蓝图初始化
        	-template   # 模板
            	-backend.html
            -static   # 静态文件
            	-xx.jpg
            -views.py  # 视图层
            -models.py # models层,后期咱们表模型
        -api
        	-__init__.py
            -template
			-static
			-models.py
            -views.py
	-manage.py  # 启动文件

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

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

相关文章

文件包含漏洞简介

今天继续给大家介绍渗透测试相关知识,本文主要内容是文件包含漏洞简介。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权设备…

一些好玩的js小作品

今天小编给大家带来了一些很实用的js小作品,下面请一看究竟。 1、计算详细年龄工具js脚本 2、检测是否安装Flash插件及版本号js脚本 3、无法查看源码的页面 4、面积换算js脚本 5、体积和容积换算js脚本 6、长度换算js脚本 7、重量换算js脚本 8、只能输入汉字…

记一些女装数据分析

文章目录服装维度女装生命周期门店维度常见度量值衍生指标服装维度 尺码:XS、S、M、L、XL颜色:黑、红、蓝、白……一级分类:上半身、下半身、全身季节:春、夏、秋、冬价格类型:正价、特价、折扣价、降价、优惠券…价格…

Android自定义ViewGroup布局进阶,完整的九宫格实现

自定义ViewGroup九宫格 前言 在之前的文章我们复习了 ViewGroup 的测量与布局,那么我们这一篇效果就可以在之前的基础上实现一个灵活的九宫格布局。 那么一个九宫格的 ViewGroup 如何定义,我们分解为如下的几个步骤来实现: 先计算与测量九…

【Linux学习】进程信号

文章目录前言一、信号初识1. 信号的概念2. Linux中的普通信号3. 信号的处理二、信号产生1. 终端按键产生信号2. 系统调用发送信号2.1 kill函数2.2 raise函数2.3 abort函数3. 由软件条件产生信号3.1 SIGPIPE信号3.2 alarm函数4. 由硬件异常产生信号三、信号阻塞1. 信号阻塞即其他…

[前端面试题]flex上下布局

[前端面试题]flex上下布局 [万字长文]一文教你彻底搞懂flex布局 [CSS]一些flex的应用场景 页面中有两个元素。元素bottom固定在底部,靠内容来撑开;而元素top在上边,高度自适应,自动铺满除bottom剩下的空间,且top内容…

第十四届蓝桥杯集训——JavaC组第十篇——分支语句

第十四届蓝桥杯集训——JavaC组第十篇——分支语句 目录 第十四届蓝桥杯集训——JavaC组第十篇——分支语句 if单分支 if单分支语法 if单分支语句示例 单分支例题: 连续单分支示例 if简写语法 if双分支语句 if双分支语法 if双分支语法示例 if双分支简写法…

全栈jmeter接口测试教程之Jmeter+ant+jenkins实现持续集成

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具,并配置好环境变量;参考:https://www.cnblogs.com/YouJeffrey/p/16029894.html jmeter默认保存的是.jtl格式的文件,要设置一下bin/jmeter.properties,文件内容…

圣诞节快来了~用python做一个粒子烟花震撼众人赚个女孩回来吧~

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 准备 准备一下你运行效果的背景图 以及一首你喜欢或那你女朋友喜欢的音乐 效果 代码展示 导入模块 import random import pygame as py import tkinter as tk from time import time, sleep fr…

Fuzzing with Data Dependency Information阅读笔记

相关数据 论文:https://www.s3.eurecom.fr/docs/eurosp22_mantovani.pdf 开源代码:https://github.com/elManto/DDFuzz 论文背景 这篇论文是2022年发表在sp上的一篇论文,也是在afl的基础上进行改进的一篇论文。afl是在afl的基础上进行整合…

第二十六章 linux-输入子系统二

第二十六章 linux-输入子系统二 文章目录第二十六章 linux-输入子系统二框架三个重要结构体struct input_devstruct input_handlerstruct input_handle框架 Linux系统支持的输入设备繁多,例如键盘、鼠标、触摸屏、手柄或者是一些输入设备像体感输入等等&#xff0c…

[附源码]Python计算机毕业设计电子投票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

30岁转行网络安全来得及吗?有发展空间吗?

30岁转行网络安全来得及吗?有发展空间吗? 现阶段,很多30岁左右的人群都面临就业难的问题,尤其是对于年龄已过30.没有一技之长的人。现阶段,网络安全行业已成了风口行业,也有很多30岁人群也想转行学习网络安全,但又担…

python之界面案例

目录 一、海龟绘图 二、图形化编程入门 窗口创建 三、表格控件的简单认知 四、综合案例 一、海龟绘图 海龟绘图作用:提升界面美观度,吸引用户使用 学习网址: turtle --- 海龟绘图 — Python 3.8.14 文档 二、图形化编程入门 窗口创建 …

【数据结构与算法】跳表

目录 一、什么是跳表 二、跳表的效率验证 三、跳表的实现 1、search 2、add 3、erase 四、跳表与其它搜索结构对比 总结 一、什么是跳表 跳表是一个随机化的数据结构,可以被看做二叉树的一个变种,它在性能上和红黑树,AVL树不相上下&am…

【高精度定位】RTK定位与RTD定位知识科普

高精度定位一般指亚米级别或厘米级别的定位,常见的室内有蓝牙AoA和UWB两种技术,室外有北斗地基增强技术,这些技术都是采用算法进行定位。 工业4.0时代,在资源和环境约束不断强化的背景下,创新驱动传统制造向智能制造转…

【MAUI】条形码,二维码扫描功能

前言 本系列文章面向移动开发小白,从零开始进行平台相关功能开发,演示如何参考平台的官方文档使用MAUI技术来开发相应功能。 介绍 移动端的扫描条形码、二维码的功能已经随处可见,已经很难找到一个不支持扫描的App了,但是微软的…

sync fsync fdatasync 三者的区别

传统的UNIX系统实现在内核中设有缓冲区高速缓存或页高速缓存,大多数磁盘I/O都通过缓区进行。当我们向文件写入数据时,内核通常先将数据复制到缓冲区中,然后排入队列,晚些时候再入磁盘。这种方式被称为延迟写 (delayed wrie)(Bach[…

最惨面试季:“这么简单的9道题,我刷掉了90%的测试员。”

人往高处走水往低处流,十二月将至,“金三银四”招聘季还会远吗? 远观2022年的招聘季,在资本寒冬的映照下,的确萧条了不少,裁员、取消年终奖、末尾淘汰制等热门制度,让很多人陷入了“工作难保&a…

【自然语言处理】隐马尔科夫模型【Ⅴ】解码问题

有任何的书写错误、排版错误、概念错误等,希望大家包含指正。 由于字数限制,分成六篇博客。 【自然语言处理】隐马尔可夫模型【Ⅰ】马尔可夫模型 【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述 【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题…