码迷,mamicode.com
首页 > 其他好文 > 详细

Flask 第十四话之请求上下文

时间:2020-03-15 11:28:33      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:线程   glob   多线程   应用   实现   als   world   nbsp   ash   

一、简介

在 flask 中,视图函数需要知道它执行情况的请求信息(请求的 url,参数,方法等)以及应用信息(应用中初始化的数据库等),才能够正确运行。

最直观地做法是把这些信息封装成一个对象,作为参数传递给视图函数。但是这样的话,所有的视图函数都需要添加对应的参数,即使该函数内部并没有使用到它。

flask 的做法是把这些信息作为类似全局变量的东西,视图函数需要的时候,可以使用 from flask import request 获取。但是这些对象和全局变量不同的是——它们必须是动态的,因为在多线程或者多协程的情况下,每个线程或者协程获取的都是自己独特的对象,不会互相干扰。

那么如何实现这种效果呢?如果对 python 多线程比较熟悉的话,应该知道多线程中有个非常类似的概念  threading.local,可以实现多线程访问某个变量的时候只看到自己的数据。内部的原理说起来也很简单,这个对象有一个字典,保存了线程 id 对应的数据,读取该对象的时候,它动态地查询当前线程 id 对应的数据。

flask 中有两种上下文:application context 和 request context。上下文有关的内容定义在 globals.py 文件。

二、应用上下文使用

from flask import Flask,request,session,current_app,url_for,g
from werkzeug.local import Local,LocalStack

app = Flask(__name__)

# 应用上下文:写法一
app_context  = app.app_context()
app_context.push()
print(current_app.name)

# 应用上下文:写法二
# 只能在with函数内容
with app.app_context():
    print(current_app.name)

@app.route(/)
def hello_world():
    print(url_for(mylist))
    return Hello World!


if __name__ == __main__:
    app.run()

三、请求上下文使用

from flask import Flask,request,session,current_app,url_for,g
from werkzeug.local import Local,LocalStack

app = Flask(__name__)

@app.route(/)
def hello_world():
    print(url_for(mylist))
    return Hello World!


@app.route(/list/)
def mylist():
    return Hello World!

# 请求上下文
with app.test_request_context():
    # 手动推入一个请求上下文到请求上下文栈中
    # 如果没有请求上下文,那么先推入一个应用上下文到栈中
    print(url_for(mylist))

if __name__ == __main__:
    app.run()

 

Flask 第十四话之请求上下文

标签:线程   glob   多线程   应用   实现   als   world   nbsp   ash   

原文地址:https://www.cnblogs.com/lee-xingxing/p/12496460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!