g对象、信号、local、请求上下文、flask-session

from flask import Flask, request, g, redirect

# g对象的特性:
#   1.当前请求内你设置就可以取,必须先设置,然后取,当前请求可以无限次
#   2.如果不是当前请求,其他请求,也取不到

app = Flask(__name__)


@app.before_request
def dou():
    if request.path == '/index':
        request.name = 'sb'
        g.name = 'sb'


def set_g():
    g.name = '老子最帅'


# @app.route('/')
# def index():
#     set_g()
#     return redirect('/index')
#

@app.route('/index')
def login():
    print(g.name)
    return '2b'


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

信号:

from flask import Flask, signals

app = Flask(__name__)


# 第一步,编写一个函数
def func(*args, **kwargs):
    print('触发信号', args, kwargs)


# 第二部:注册信号
signals.request_started.connect(func)  # 请求来之前执行这个

# 第三部:触发信号(内置信号,不需要手动触发,框架自动触发)


@app.route('/')
def index():

    return 'index'

if __name__ == '__main__':
    app.run()
"""
request_started = _signals.signal('request-started')                # 请求到来前执行
request_finished = _signals.signal('request-finished')              # 请求结束后执行
 
before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行
template_rendered = _signals.signal('template-rendered')            # 模板渲染后执行
 
got_request_exception = _signals.signal('got-request-exception')    # 请求执行出现异常时执行
 
request_tearing_down = _signals.signal('request-tearing-down')      # 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)
 
appcontext_pushed = _signals.signal('appcontext-pushed')            # 应用上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped')            # 应用上下文pop时执行
message_flashed = _signals.signal('message-flashed')                # 调用flask在其中添加数据时,自动触发
"""

自定义信号

from flask import Flask, current_app, flash, render_template
from flask.signals import _signals

app = Flask(import_name=__name__)

# 1.自定义信号
xxxxx = _signals.signal('xxxxx')


# 2.定义函数
def func(*args, **kwargs):
    print('信号来了', args, kwargs)


# 3.绑定函数
xxxxx.connect(func)


@app.route("/x")
def index():
    # 触发信号
    xxxxx.send('123123', k1='v1')    # 自定义就在这里,需要什么时候执行(此时就是试图执行后运行信号)
    return 'Index'


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

local

"""
多个线程同时修改同一个数据,会造成数据混乱,
方法一:加线程锁
方法二:复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存储

"""
# from threading import Thread
# import time
#
# cxw = -1
#
#
# def task(arg):
#     global cxw
#     cxw = arg
#     time.sleep(2)
#     print(cxw)
#
#
# for i in range(10):
#     t = Thread(target=task, args=(i,))
#     t.start()
# 结果为9,9,9为什么全部是9,当第一进程启动进去,等待2秒,因为异步其他进程也同时启动最终,cxm全局结果赋值为最后的9

# from threading import Thread
# from threading import local
# import time
# from threading import get_ident
#
# # 特殊的对象
# cxw = local()
#
#
# def task(arg):
#     # 对象.val = 1/2/3/4/5
#     # cxw['线程id']['value']=arg
#     cxw.value = arg
#     time.sleep(2)
#     # cxw['线程id']['value']
#     print(cxw.value)
#
#
# for i in range(10):
#     t = Thread(target=task, args=(i,))
#     t.start()

# 把数据存储到一个对象中,每个线程分配一个变量进行独立操作

# 函数的方式
from threading import get_ident, Thread
import time

storage = {}


def set(k, v):
    ident = get_ident()
    if ident in storage:
        storage[ident][k] = v
    else:
        # cxw['线程id']['value']=arg
        # storage[1][val]=arg
        # storage={1:{val:agr}}
        storage[ident] = {k: v}


def get(k):
    ident = get_ident()
    # 1
    # storage = {1: {val: agr}}
    return storage[ident][k]


def task(arg):
    set('val', arg)
    time.sleep(1)
    v = get('val')
    print(v)


for i in range(10):
    t = Thread(target=task, args=(i,))
    t.start()

请求上下文

"""
多个线程同时修改同一个数据,会造成数据混乱,
方法一:加线程锁
方法二:复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存储

"""
# from threading import Thread
# import time
#
# cxw = -1
#
#
# def task(arg):
#     global cxw
#     cxw = arg
#     time.sleep(2)
#     print(cxw)
#
#
# for i in range(10):
#     t = Thread(target=task, args=(i,))
#     t.start()
# 结果为9,9,9为什么全部是9,当第一进程启动进去,等待2秒,因为异步其他进程也同时启动最终,cxm全局结果赋值为最后的9

# from threading import Thread
# from threading import local
# import time
# from threading import get_ident
#
# # 特殊的对象
# cxw = local()
#
#
# def task(arg):
#     # 对象.val = 1/2/3/4/5
#     # cxw['线程id']['value']=arg
#     cxw.value = arg
#     time.sleep(2)
#     # cxw['线程id']['value']
#     print(cxw.value)
#
#
# for i in range(10):
#     t = Thread(target=task, args=(i,))
#     t.start()

# 把数据存储到一个对象中,每个线程分配一个变量进行独立操作

# 函数的方式
from threading import get_ident, Thread
import time

storage = {}


def set(k, v):
    ident = get_ident()
    if ident in storage:
        storage[ident][k] = v
    else:
        # cxw['线程id']['value']=arg
        # storage[1][val]=arg
        # storage={1:{val:agr}}
        storage[ident] = {k: v}


def get(k):
    ident = get_ident()
    # 1
    # storage = {1: {val: agr}}
    return storage[ident][k]


def task(arg):
    set('val', arg)
    time.sleep(1)
    v = get('val')
    print(v)


for i in range(10):
    t = Thread(target=task, args=(i,))
    t.start()

flask-session

from flask import Flask, session
from flask_session import RedisSessionInterface
import redis

app = Flask(__name__)
app.secret_key = "ajksda"
conn = redis.Redis(host='127.0.0.1', port=6379)
# use_signer是否对key签名
app.session_interface = RedisSessionInterface(conn, key_prefix='jason', use_signer=True, permanent=False)


@app.route('/')
def hello_world():
    session['sb'] = 'jason'
    return 'Hello World!'


@app.route("/index")
def index():
    print(session['sb'])
    return "ok"


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

session第二种方法

from flask import Flask, session   # 推荐
import redis
from flask_session import Session

app = Flask(__name__)
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379')
app.config['SESSION_KEY_PREFIX'] = "jason"
Session(app)


@app.route('/')
def hello_world():
    session['sb'] = 'jason'
    return 'Hello World!'


@app.route("/index")
def index():
    print(session['sb'])
    return "ok"


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

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/wukai66/p/11860954.html