当前位置:   article > 正文

Flask会话控制和上下文对象_flask 上下文对象

flask 上下文对象

一、会话控制

会话控制: cookie 和 session

  • session本质上就是保存在服务端中的一个文件,文件中存储了用户的会话信息[我们开发者设置进行的用户登录状态或者访问历史]
  • session依赖于cookie来实现,因为用户在每次请求服务端时,需要客户端发送属于当前用户的session文件名,一般这个文件名在客户端中使用cookie来保存的,名称一般是session_id
# 在flask中会话控制的保存主要通过request和response来完成
from flask import reuqest # 请求对象 获取cookie信息
from flask import make_response # 响应对象 设置cookie信息
  • 1
  • 2
  • 3

所谓的会话,就是用户和浏览器中网站之间一次交互过程.
会话的开始是在用户打开浏览器以后第一次访问网站.
会话的结束时在用户关闭浏览器以后



因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。



有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等

实现状态保持主要有两种方式:

在客户端存储信息使用Cookie,本地存储,token[jwt,oauth]

在服务器端存储信息使用Session,redis

1.1 Cookie

Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie的key/value可以由服务器端自己定义。

使用场景: 登录状态, 浏览历史, 网站足迹


Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用

Cookie基于域名安全,不同域名的Cookie是不能互相访问的。如访问luffy.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到luffy.com写的Cookie信息

浏览器的同源策略针对cookie也有限制作用.

当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

1.1.1设置Cookie

设置cookie需要通过flask的Response响应对象来进行设置,由flask内部提供了一个make_response函数给我们可以快速创建响应对象

from flask import make_response
@app.route("/cookie/set_cookie")
def set_cookie():
    """设置cookie"""
    # return "python"
    response = make_response("python")  # 这一句代码和上面一句代码是一样
    # 设置cookie, 默认有效期是临时cookie,浏览器关闭就失效
    response.set_cookie("uid","100")
    # max_age设置有效期,单位:秒
    resp.set_cookie("Itcast2", "Python1", max_age=3600)
    # 直接加载headers里面
    resp.headers["Set-Cookie"] = "Itcast3=Python3; Expires=Sat, 18-Nov-2017 04:36:04 GMT; Max-Age=3600; Path=/"
    return response
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
1.1.2 获得和删除Cookie
@app.route("/get_cookie")
def get_cookie():
	# 获得cookie
    c = request.cookies.get("Itcast")
    return c


@app.route("/delete_cookie")
def delete_cookie():
    resp = make_response("del success")
    # 删除cookie
    resp.delete_cookie("Itcast1")
    return resp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
1.2 Session

对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息

在服务器端进行状态保持的方案就是Session

注意: Session依赖于Cookie,而且flask中使用session,需要配置SECRET_KEY选项,否则报错.

1.2.1 设置session
from flask import Flask, session, current_app


app = Flask(__name__)

# flask的session需要用到的秘钥字符串
app.config["SECRET_KEY"] = "dhsodfhisfhosdhf29fy989"


# flask默认把session保存到了cookie中

@app.route("/login")
def login():
    # 设置session数据
    session["name"] = "python"
    session["mobile"] = "18611111111"
    return "login success"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
1.2.2获取session
@app.route("/get_session")
def get_session():
    """获取session"""

    uname = session.get("user_name","session数据没有了")

    return uname
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

二、上下文对象

2.1简介

  实际上所谓的上下文,在该场景下就是包括了一次请求所包含的信息,包括了从客户(一般是浏览器)发送过来的数据,例如,登陆时使用的用户名密码;以及在中间处理过程中生成的数据,例如,每次请求时我们可能会需要新建一个数据库链接。

  Flask 会在接收每次请求的时候将参数自动转换为相应的对象,也就是 request、session,一般来说上下文传递可以通过参数进行,这也就意味这每个需要该上下文的函数都要多增加一个入参,比如request,在Django里面,每次都在视图函数中传入request,保证数据不互相干扰。但在Flask里面它其实是一个全局变量,每个用户从前端传过来的数据都在request里面,所有用户公共一个request数据肯定出错,于是Flask 提供了一个类似于全局变量的实现方式(如下会讲到这一参数是线程安全的)。
  在多线程服务器中,通过线程池处理不同客户的不同请求,当收到请求后,会选一个线程进行处理,请求的临时对象(也就是上下文)会保存在该线程对应的全局变量中(通过线程 ID 区分),这样即不干扰其他线程,又使得所有线程都可以访问。

2.2 Flask的上下文对象

如上所述,Flask 有两种上下文,分别是:

RequestContext 请求上下文

  • Request 请求的对象,会封装每次的 Http 请求 (environ) 的内容;

  • Session 会根据请求中的 cookie,重新载入该访问者相关的会话信息。

AppContext 程序上下文

  • g 处理请求时用作临时存储的对象,每次请求都会重设这个变量;

  • current_app 当前激活程序的程序实例。

生命周期

  • current_app 的生命周期最长,只要当前程序实例还在运行,都不会失效。

  • request 和 g 的生命周期为一次请求期间,当请求处理完成后,生命周期也就完结了。

  • session 就是传统意义上的 session,只要还未失效(用户未关闭浏览器、没有超过设定的失效时间),那么不同的请求会共用同样的 session。

2.2.1应用上下文

它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。
应用上下文对象有:current_app,g

  1. current_app

应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称也可以在current_app中存储一些变量,例如:

  • 用的启动脚本是哪个文件,启动时指定了哪些参数

  • 加载了哪些配置文件,导入了哪些配置

  • 连接了哪个数据库

  • 有哪些可以调用的工具类、常量

  • 当前flask应用在哪个机器上,哪个IP上运行,内存多大

# 读取配置参数
print(current_app.config.get("ITCAST"))
  • 1
  • 2
  1. g变量

g 作为 flask 程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

@app.route("/index")
def index():
	g.name = "abc"
	g.value = 1
	a = hello()
	return a
# 利用g传递参数,可以在定义函数时定义形参,但是数据多的时候,比较麻烦,可以用g变量传递
def hello():
 	return a.name * g.value
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意:g变量存活时间只在一个请求周期,当请求处理完成后,生命周期也就完结了,所以不同的请求,会有不同的g变量。

2.2.2请求上下文

请求上下文中包括了 request、session 变量,包含了一次请求的上下文信息,类似于应用上下文,同样可以通过两种方式进行创建。

  • 当应用收到请求之后会自动创建;

  • 可以通过 app.test_request_context(‘/route?param=value’) 手动创建。

与应用上下文不同的是,请求上下文会接收一个参数代表了一次请求。另外,需要注意的是,在创建请求上下文的时候,如果没有当前的应用上下文,或者不是本应用的上下文,会自动创建一个应用上下文。
请求上下文对象有:request、session

  1. request

封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get(‘user’),获取的是get请求的参数。

  1. session

用来记录请求会话中的信息,针对的是用户信息。举例:session[‘name’] = user.id,可以记录用户信息。还可以通过session.get(‘name’)获取用户信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/448846
推荐阅读
相关标签
  

闽ICP备14008679号