扩展知识

https://liuqingzheng.top/article/1/05-CGI,FastCGI,WSGI,uWSGI,uwsgi%E4%B8%80%E6%96%87%E6%90%9E%E6%87%82/

服务器			框架
wsgiref django
uWSGI django
werkzeug flask
tornado tornado框架 # 1 flask python 微小的web框架,整个服务可以放在一个文件中,也可以做成很大的项目,需要借助于第三方
-flask和django :django内置了很多:后台管理,用户和权限管理,session,缓存,消息框架,自定制命令,flask只保留了基本的请求与响应处理 # 2 wsgi协议:Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口
-之前部署路飞:uwsgi跑在8888端口,使用了uwsgi协议跑的,所以不能接受http协议,用浏览器直接访问8888,有问题,咱们访问了8080【nginx】---->把http协议转成uwsgi协议----》8888
-测试阶段,使用wsgiref运行django,监听的就是http协议,浏览器中可以直接访问

# 3 flask快速使用:咱们讲的使用没有区别,源码动了一些
-1.x :
-2.x :大动了
-变量定义指定类型
#原来:
current_app=LocalProxy()
#现在,指定了变量current_app是Flask类型
current_app:"Flask" = LocalProxy()
-函数传参和返回值指定类型
# 原来:
def index(name, cv):
pass
# 现在,公司里用的多
def index(name:str, cv:ContextVar[t.Any])->None:
pass

Flask请求与响应

请求对象

1 request.method		# 提交的方法
2 request.args # get请求提交的数据
3 request.form # post请求提交的数据
4 request.values # post和get提交的数据总和
5 request.cookies # 客户端所带的cookie
6 request.headers # 请求头
7 request.path # 不带域名,请求路径
8 request.full_path # 不带域名,带参数的请求路径
9 request.script_root
10 request.url
11 request.base_url # 带域名请求路径
12 request.url_root
13 request.host_url
14 request.host
15 request.files
16 request.data # django中的body

响应对象

@app.route('/',methods=['GET','POST'])
def index():
# 1四件套
# -render_template
# -redirect
# -jsonify
# -''
# 2写入响应头-->没有响应对象,先做出一个响应对象
# from .wrappers import Response
res='helloe'
res=make_response(res)
# 往Response的对象中,放入响应头
res.headers['name']='zxr'
# 3 写入cookie
# res.set_cookie('xx','xx')
res.delete_cookie('xx')
'''
key, 键
value=’’, 值
max_age=None, 超时时间 cookie需要延续的时间(以秒为单位)如果参数是\ None`` ,这个cookie会延续到浏览器关闭为止
expires=None, 超时时间(IE requires expires, so set it if hasn’t been already.)
path=’/‘, Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问,浏览器只会把cookie回传给带有该路径的页面,这样可以避免将cookie传给站点中的其他的应用。
domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如, domain=”.example.com”所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只能由设置它的站点读取
secure=False, 浏览器将通过HTTPS来回传cookie
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
'''
return res

前后端分离和混合

# 前后端混合,cookie是后端写入的
res.set_cookie('xx','xx')混合都是这么写的,这样写了,浏览器就会把cookie保存到cookie中
本质是后端吧cookie放到响应头中,浏览器读到响应头中有cookie,把cookie写入到浏览器中
# 前后端分离后
直接把客户端要存到cookie中的数据,放到响应体中
前端(浏览器,app,小程序),自己取出来,放到相应的位置
浏览器使用js自己写入到cookie
app 自己使用代码写入到某个位置

session的使用和原理

# 以django为例
登录视图函数以后-->request.session['name'] = 'zxr'
1 生成一个随机字符串
2 把session字典序列化放到django_session表中
3 以session为key,随机字符串为value,写入到cookie中 下次再来的时候,会携带者随机字符串,在中间件中根据sessionid取出随机字符串去django_session表中,根据这个随机字符串取出value值,然后解密,得到字典,字典放到request.session,就可以拿到上次我们存进去的那个字典 所以django的中间件既写了request又写response 虽然是在视图函数中写的,但是是在中间件中执行的 如果request.session为空,不做任何事,如果不为空,有更改--->重新写入session表中的value,没改过的话不做任何事

# flask框架
登录视图函数,判断session是否为空,不为空,又加了东西,把这个字典序列化成字符串然后使用密钥加密,把加密的字符串以cookie的形式写入浏览器(就会看到session对应的一个随机字符串,而且是三段式的)
下次访问一个需要登录的视图函数,进入视图函数之前,根据session取出三段式,然后进行反序列化,解密得到session对象,在后续的视图函数中使用

session的使用

# 放值 视图函数中
导入全局的session
session['name']='lqz' # 取值 视图函数中
导入全局的session
print(session['name'])

session源码分析

# 整个flask,从请求进来,到请求走的整个流程
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 的 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) # app.session_interface 就是Flask对象中有个session_interface对象
SecureCookieSessionInterface()
-open_session:请求来了,从cookie中取出三段串,反序列化解密放到session中
-save_session:请求走了,把session字典中的值,序列化加密,放到cookie中 # open_session:请求来了执行
def open_session(self, app, request) :
s = self.get_signing_serializer(app)
if s is None:
return None
# val 就是取出的三段:eyJhZ2UiOiIxOSIsIm5hbWUiOiJscXoifQ.Y5ac9g.vOomQFqFuaqXWqRQhvSNyc61UIk
val = request.cookies.get('session')
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']='lqz'
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,
)
1 请求来的时候,会执行open_session--->取出cookie,判断是否为空,如果不为空,把它反序列化,解密--->字典--->转到session对象中--->视图函数

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

扩展知识、Flask请求与响应、session的使用和原理、session源码分析的更多相关文章

  1. Flask快速入门day02(1、CBV使用及源码分析,2、模板用法,3、请求与响应的基本用法,4、session的使用及源码分析,5、闪现,6、请求扩展)

    目录 Flask框架 一.CBV分析 1.CBV编写视图类方法 二.CBV源码分析 1.CBV源码问题 2.补充问题 3.总结 三.模板 1.py文件 2.html页面 四.请求与响应 1.reque ...

  2. Tomcat源码分析——请求原理分析(上)

    前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程 ...

  3. Flask框架cbv的写法、请求与响应、请求扩展、session源码分析、闪现

    本篇文章将会详细讲在flask框架如何写cbv.请求与响应.请求扩展.session源码分析.闪现等知识点. 目录 一.flask写CBV 二.请求与响应 三.session 四.闪现flash 五. ...

  4. Flask框架(三)—— 请求扩展、中间件、蓝图、session源码分析

    Flask框架(三)—— 请求扩展.中间件.蓝图.session源码分析 目录 请求扩展.中间件.蓝图.session源码分析 一.请求扩展 1.before_request 2.after_requ ...

  5. drf-day5——反序列化类校验部分源码分析、断言、drf请求、drf响应、视图组件及两个视图基类、基于GenericAPIView+5个视图扩展类

    目录 一.反序列化类校验部分源码解析(了解) 二.断言 三.drf之请求 3.1 Request能够解析的前端传入的编码格式 3.2 Request类有哪些属性和方法(学过) 常用参数 Respons ...

  6. Flask系列10-- Flask请求上下文源码分析

    总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...

  7. Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号

    Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...

  8. Flask框架(五) —— session源码分析

    Flask框架(五) —— session源码分析 目录 session源码分析 1.请求来了,执行__call__方法 2.__call__方法 3.调用__call__方法 3.1.ctx = s ...

  9. Django框架之drf:5、反序列化器校验部分源码分析、断言、drf之请求与响应、视图组件介绍及两个视图基类、代码部分实战

    Django框架之drf 目录 Django框架之drf 一.反序列化类校验部分源码解析 二.断言 三.drf之请求 1.Request能够解析的前端传入编码格式 2.Request类中的属性和方法 ...

  10. 知识小罐头07(tomcat8请求源码分析 下)

    感觉最近想偷懒了,哎,强迫自己也要写点东西,偷懒可是会上瘾的,嘿嘿!一有写博客的想法要赶紧行动起来,养成良好的习惯. ok,继续上一篇所说的一些东西,上一篇说到Connector包装了那两个对象,最后 ...

随机推荐

  1. Java进阶知识点:接口幂等性

    幂等概念    在计算机中,表示对同一个过程应用相同的参数多次和应用一次产生的效果是一样,这样的过程即被称为满足幂等性.    也可以进行如下表述:一个HTTP请求方法,如果被请求多次和被请求一次效果 ...

  2. Spring中的单例Bean是线程安全的吗

    前言   Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean ...

  3. 浅谈Java异常处理机制

    前言   在 Java 中,异常被当作对象来处理,所有的异常都有一个共同的祖先java.lang.Throwable类.Throwable有两个重要的子类Exception(异常) 和 Error(错 ...

  4. CF1928G Vlad and Trouble at MIT

    CF1928G Vlad and Trouble at MIT Vlad and Trouble at MIT Problem MIT的学生宿舍可以用一棵有\(n\)个顶点的树来表示,每个顶点代表一个 ...

  5. 【非对称加密】详解及Java实现

    非对称加密详解及Java实现 一.非对称加密概述 非对称加密(Asymmetric Cryptography),也称为公钥加密,是一种使用一对密钥(公钥和私钥)进行加密和解密的加密方法.它与对称加密的 ...

  6. 【渗透测试】不怎么水的洞之IP伪造

    漏洞原理 有些应用程序有记录用户IP的功能或者限制IP白名单的功能,如果应用程序从请求头字段获取用户IP,可能会被攻击者伪造,来达到欺骗服务器的目的. 案例一 发现操作日志页面有个记录用户IP功能 插 ...

  7. CF958E1 题解

    Problem 原题链接 Meaning 在二维平面内,有位置不同且不存在三点共线的 \(R\) 个红点和 \(B\) 个黑点,判断是否能用一些互不相交的线段连接每一个点,使得每条线段的两端都分别是黑 ...

  8. EDGE浏览器提示“无法安全下载……”

    EDGE浏览器升级后,下载文件时显示"无法安全下载 --"可以点击该下载后面的"-",再点击"保留",然后会弹出一个对话框,提示" ...

  9. SQL Server中使用临时表进行数据备份与恢复

    在日常的数据库管理中,我们经常需要对数据进行备份和恢复操作.SQL Server提供了多种工具和命令来帮助我们完成这些任务.本文将介绍一种简单的方法,即使用临时表来备份特定记录,清空表,然后将数据恢复 ...

  10. vite V3.0.0 vite.config.ts 引入插件vite-plugin-vue-setup-extend-plus报错(vueSetupExtend不是一个函数)

    vite V3.0.0 vite.config.ts 引入插件报错(***** 不是函数) ·问题 #9414 ·Vitejs/Vite (github.com) 我的错误提示如下 ERROR fai ...