flask框架(七)——蓝图、请求上下文、g对象、信号、flask_session
蓝图
作用:对程序进行目录结构划分
不使用蓝图情况下,自己分文件
目录结构:
- -templates
- -views
- -__init__.py
- -user.py
- -order.py
- -app.py
app.py
- from views import app
- if __name__ == '__main__':
- app.run()
__init__.py
- from flask import Flask,request
- app = Flask(__name__)
- #不导入这个不行
- from . import account
- from . import order
- from . import user
user.py
- from . import app
- @app.route('/user')
- def user():
- return 'user'
order.py
- from . import app
- @app.route('/order')
- def order():
- return 'order'
使用蓝图 (Blueprint)
目录结构:
- -app01
- -pro
- -templates
- -__init__.py
- -views
- -manage.py
manage.py
- from pro import app
- if __name__ == '__main__':
- app.run()
__init__.py
- from flask import Flask
- app=Flask(__name__)
- from pro import views
- app.register_blueprint(views.us)
views.py
- from flask import Blueprint,render_template
- us=Blueprint("user",__name__)
- @us.route("/")
- def index():
- return render_template("index.html")
总结:
1 xxx = Blueprint('account', name,url_prefix='/xxx') :蓝图URL前缀,表示url的前缀,在该蓝图下所有url都加前缀
2 xxx = Blueprint('account', name,url_prefix='/xxx',template_folder='tpls'):给当前蓝图单独使用templates,向上查找,当前找不到,会找总templates
3 蓝图的befort_request,对当前蓝图有效
4 大型项目,可以模拟出类似于django中app的概念
请求上下文源码分析
- 第一阶段:将ctx(request,session)放到Local对象上
- 第二阶段:视图函数导入:request/session
- request.method
- -LocalProxy对象.method,执行getattr方法,getattr(self._get_current_object(), name)
- -self._get_current_object()返回return self.__local(),self.__local(),在LocakProxy实例化的时候,object.__setattr__(self, '_LocalProxy__local', local),此处local就是:partial(_lookup_req_object, 'request')
- -def _lookup_req_object(name):
- top = _request_ctx_stack.top #_request_ctx_stack 就是LocalStack()对象,top方法把ctx取出来
- if top is None:
- raise RuntimeError(_request_ctx_err_msg)
- return getattr(top, name)#获取ctx中的request或session对象
- 第三阶段:请求处理完毕
- - 获取session并保存到cookie
- - 将ctx删除
程序运行,两个LocalStack()对象,一个里面放request和session,另一个放g和current_app
g对象
专门用来存储用户信息的g对象,g的全称的为global
g对象的特性:
当前请求内你设置就可以取,必须先设置,后取,当前请求可以取无限次。就算你在当前请求设置了g对象,如果不取,其他的请求也取不到。
g对象和session的区别
- session对象是可以跨request的,只要session还未失效,不同的request的请求会获取到同一个session,但是g对象不是,g对象不需要管过期时间,请求一次就g对象就改变了一次,或者重新赋值了一次
代码示例:
- from flask import Flask,g,redirect
- app=Flask(__name__)
- def set_g():
- g.name='sb' #设置g(可以单独这样设置,也可以在视图函数内设置,直接g.属性名设置)
- @app.route("/")
- def index():
- set_g()
- return redirect("/index")
- @app.route("/index")
- def login():
- print(g.name) #获取g对象
- return ""
- if __name__ == '__main__':
- app.run()
信号
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为
安装:pip install blinker
内置信号:
- 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,signals
- app = Flask(__name__)
- #给信号绑定要执行的函数
- #无需管调用,因为flask,已经给我们设置调用点
- def func(*args,**kwargs):
- print('触发型号',args,kwargs)
- #与该信号进行绑定
- signals.request_started.connect(func) #绑定信号,请求到来前就会执行绑定的函数
- # 触发信号: signals.request_started.send()
- @app.before_first_request
- def before_first1(*args,**kwargs):
- print("befor_first_request")
- @app.before_request
- def before_first3(*args,**kwargs):
- print("befor_request")
- @app.route('/',methods=['GET',"POST"])
- def index():
- print('视图')
- return "视图"
一个信号触发点的流程:(了解知识点)
- a. before_first_request
- b. 触发 request_started 信号
- c. before_request
- d. 模板渲染
- 渲染前的信号 before_render_template.send(app, template=template, context=context)
- rv = template.render(context) # 模板渲染
- 渲染后的信号 template_rendered.send(app, template=template, context=context)
- e. after_request
- f. session.save_session()
- g. 触发 request_finished信号
- 如果上述过程出错:
- 触发错误处理信号 got_request_exception.send(self, exception=e)
- h. 触发信号 request_tearing_down
自定义信号(了解)
- from flask import Flask
- from flask.signals import _signals
- app = Flask(import_name=__name__)
- # 自定义信号
- xxxxx = _signals.signal('xxxxx')
- def func(sender,a):
- print(sender,a)
- print("我是自定义信号")
- # 自定义信号中注册函数
- xxxxx.connect(func)
- @app.route("/x")
- def index():
- # 触发信号
- xxxxx.send("sb",a="1") #最少传递一个参数
- return 'Index'
- if __name__ == '__main__':
- app.run()
flask-session
作用:将默认保存的签名cookie中的值 保存到 redis/memcached/file/Mongodb/SQLAlchemy
安装:pip3 install flask-session
使用1 (复杂的方式)
- 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设置是否需要secret_key签名,permanent设置关闭浏览器cookie是否失效
- 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()
使用2 (简单的方式)
- 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='')
- 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()
flask框架(七)——蓝图、请求上下文、g对象、信号、flask_session的更多相关文章
- flask的请求上下文request对象
Flask从客户端收到请求时,要让视图函数能访问请求对象request ,才能处理请求.我们可以将request对象作为参数传到试图函数里,比如: from flask import Flask, r ...
- 【Flask源码分析——请求上下文与应用上下文】
Flask中有两种上下文,请求上下文和应用上下文.两者的作用域都处于一个请求的局部中. 查看源代码,上下文类在flask.ctx模块中定义 AppContext类定义应用上下文,app是当前应用Web ...
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- Flask框架中特有的变量/函数及上下文
模板中特有的变量和函数 你可以在自己的模板中访问一些 Flask 默认内置的函数和对象 config 你可以从模板中直接访问Flask当前的config对象: {{config.SQLALCHEMY_ ...
- flask框架上下文
上下文 上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask中有两种上下文,请求上下文和应用上下文 请求上下文(request context) 在 flask 中,可以 ...
- flask框架基本使用(1)(基本框架搭建与请求参数接收)
#转载请留言联系 Flask 是一个 Python 实现的 Web 开发微框架. 1.搭建Flask开发环境 在你开发项目的时候,你拥有的项目越多,同时使用不同版本的 Python 工作的可能性也就越 ...
- Flask框架知识点整合
Flask 0.Flask简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收ht ...
- 浅谈 Flask 框架
一.框架对比 Django —— 教科书式框架 优势:组件全,功能全,教科书 劣势:占用资源,创建复杂度高 Flask —— 以简单为基准开发,一切从简,能省则省 优势:轻,块 劣势:先天不足,第三方 ...
- flask框架的教程--程序的基本结构[二]
一个简单的程序 from flask import Flask # 实例化app 对象 app = Flask(__name__) @app.route('/') def index(): retur ...
- flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)
flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...
随机推荐
- 不用VS调试.Net
将来,任何开发人员都将需要调试应用程序,并且将无法访问Visual Studio,在某些情况下甚至无法访问源代码.例如,在生产web或应用服务器上调试问题时,我真的不想安装Visual Studio并 ...
- codevs 2780 ZZWYYQWZHZ
2780 ZZWYYQWZHZ 时间限制: 1 s 空间限制: 32000 KB 题目等级: 青铜 Bronze 题目描述 Description 可爱的小管在玩吹泡泡.忽然,他想到 ...
- CF1237E 【Balanced Binary Search Trees】
首先我们要注意到一个性质:由于根与右子树的根奇偶性相同,那么根的奇偶性与\(N\)相同 然后我们发现对于一个完美树,他的左右两个儿子都是完美树 也就是说,一颗完美树是由两棵完美树拼成的 注意到另一个性 ...
- 【JZOJ6206】【20190610】二分图边染色
题目 对一个二分图的边染色,满足有相同端点的边的颜色一定不同; 设最优染色为\(C\) ,你的染色为\(X\),只需要满足$ X \le 2^ {\lceil log C \rceil }$ ...
- 【CPLEX教程03】java调用cplex求解一个TSP问题模型
00 前言 前面我们已经搭建好cplex的java环境了,相信大家已经跃跃欲试,想动手写几个模型了.今天就来拿一个TSP的问题模型来给大家演示一下吧~ CPLEX系列教程可以关注我们的公众号哦!获取更 ...
- git之fatal: Could not read from remote repository
问题背景:在git bash中使用hexo g -d命令进行文章发布 详细错误信息: fatal: Could not read from remote repository. Please make ...
- CTF CMS(转)
CTF--CMS漏洞总结 海洋CMS 6.28 海洋CMS6.28命令执行漏洞 6.45-6.54 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警 8.8(未验证) 海洋cms前台到后台的g ...
- Python 实现毫秒级淘宝、京东、天猫等秒杀抢购脚本
本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可抢加购物车等待时间结算的,也可以抢聚划算的商品. 该思路可运 ...
- Mac使用秘钥登录Linux服务器
简介 在 Mac 上配置 SSH 密钥登录远程的 Linux 相关配置 1.创建本地的 SSH 密钥 本地 生成秘钥对 ssh-keygen -t rsa -C 'youxiang@aliyun.co ...
- mqtt 与 MQ 的区别
mqtt 与 MQ 的区别: mqtt:一种通信协议,类似人类交谈中的汉语.英语.俄语中的一种语言规范MQ:一种通信通道,也叫消息队列,类似人类交谈中的用电话.email.微信的一种通信方式json: ...