ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

231.7.flask-session

2022-06-02 14:02:58  阅读:141  来源: 互联网

标签:__ flask self request 231.7 session cookie app


1.简单使用

from flask import Flask, session

app = Flask(__name__)
app.secret_key = "adfas"
app.__call__()

@app.route("/index", methods=["POST", "GET"])
def index():
    session["k1"] = 123
    return "index"


@app.route("/order", methods=["POST", "GET"])
def order():
    print(session.get("k1"))
    return "order"


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

2.session流程

# coding=utf-8
# 情况1
class Foo(object):
    def __setitem__(self, key, value):
        print("__setitem__")
        pass


obj = Foo()  # __setitem__

obj["aaaa"] = 123

# 情况2


class Boo(dict):
    pass


obj2 = Foo()
obj2["xxx"] = 3124


"""
# session 处理流程
1. app.__call__()
2. self.wsgi_app(environ, start_response)
3. ctx = self.request_context(environ) = RequestContext(self, environ)  
    class RequestContext():
        if request is None:
        request = app.request_class(environ) = Request(environ)
    self.request = request
4. ctx.push() = RequestContext().push()
        self.session = self.app.open_session(self.request) = self.session_interface.open_session(self, request)
    if self.session is None:
        self.session = self.app.make_null_session()
5.self.session_interface.open_session(self, request)
        val = request.cookies.get(app.session_cookie_name)  # 第一次取不到
        if not val:
            return self.session_class() = SecureCookieSession(dict)  # 取到一个继承自字典的类对象, session初始化完毕
6. 处理试图函数
    response = self.full_dispatch_request()
7.full_dispatch_request函数最后一个结束请求
    self.finalize_request(rv)
8.finalize_request 
    response = self.process_response(response) 
9.process_response 函数处理session写回到cookie
    self.save_session(ctx.session, response)
10.save_session保存session
    self.session_interface.save_session(self, session, response)
    response.set_cookie(app.session_cookie_name, val,  # 将session设置到cookie中
                    expires=expires, httponly=httponly,
                    domain=domain, path=path, secure=secure)
"""

3.替换flask中的session

# coding=utf-8
from flask import Flask, session
from flask_session import RedisSessionInterface
from flask.sessions import SecureCookieSessionInterface
from redis import Redis
from flask.ext.session import Session

app = Flask(__name__)
app.secret_key = "afas"

"""
# 默认
其实根据源码可以非常简单的发现其实session主要就下面两个方法, 只要一个类实现了这两个方法就可以用来提到flask原生的session
原生session是存放在内存中, 请求结束之后设置到cookie中返回给前端, 下次请求时带过来
open_session
save_session
"""
app.session_interface = SecureCookieSessionInterface

"""
# 自定义方式1
RedisSessionInterface继承SessionInterface实现了open_session和save_session方法, 可以非常清楚的看到
open_session方法:
    sid = self._generate_sid()  # 获取一个uuid字符串
    return self.session_class(sid=sid, permanent=self.permanent) = RedisSession 他继承自字典, 因此可以将他的
    返回理解为返回一个字典类型的对象, 可以通过key-value设置值
save_session方法:
    通过下面这几行代码可以非常清晰的发现, 将session(一个类似字典的对象)序列化之后, 设置到redis中, 同时只是将session_id
    设置到cookie返回给前端, 下次请求只要带着这个session_id就可以从redis中获取到session信息
    val = self.serializer.dumps(dict(session))
    self.redis.setex(name=self.key_prefix + session.sid, value=val,
                     time=total_seconds(app.permanent_session_lifetime))
    response.set_cookie(app.session_cookie_name, session_id,
                            expires=expires, httponly=httponly,
                            domain=domain, path=path, secure=secure,
                            **conditional_cookie_kwargs)
"""
app.session_interface = RedisSessionInterface(
    redis=Redis(host="127.0.0.1", port=6379),
    key_prefix="flaskxxx"
)
# 自定义方式2
# app.config['SESSION_REDIS'] = Redis(host='192.168.0.94',port=6379)
# Session(app)


@app.route("/login")
def login():
    session["k1"] = 123
    return "login"


@app.route("/index")
def index():
    v = session["k1"]
    print(v)
    return "index"


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

标签:__,flask,self,request,231.7,session,cookie,app
来源: https://www.cnblogs.com/liuzhanghao/p/16337527.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有