Flask - 蓝图 | g对象 |信号
蓝图
对程序进行目录结构划分
-
蓝图之中小型系统
项目结构百度盘 2l7r
目录结构:
├── flasks
├── pro_flask # 项目文件夹(包)
├── statics # 图片等文件
├── templates # 模板文件夹
├── views # 视图函数文件夹
└── __init__.py
└── manage.py # 启动文件
flasks/manage.py
from pro_flask import app
if __name__ == '__main__':
app.run()
pro_flask/__init__.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask
app = Flask(__name__,template_folder='templates',static_folder='statics',static_url_path='/static')
@app.before_request
def before():
print("我是app里面的befor_request")
# 可当做是全局配置的函数,每个请求来都会执行该函数
# 将视图中的蓝图对象导入并注册
from .views.account import account
app.register_blueprint(account)
pro_flask/views/account.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Blueprint # 导入蓝图
from flask import render_template
from flask import request
# 实例化蓝图
account = Blueprint('acc', __name__)
# 蓝图对象配置路由
@account.route('/login.html', methods=['GET', "POST"])
def login():
print(request.form)
return render_template('login.html')
pro_flask/templates/login.html
<body>
<h1>用户登录</h1>
<form method="POST">
<input type="text" name="user"/>
<input type="submit" value="提交"/>
</form>
<img src="/static/code.png">
<img src="{{ url_for('static',filename='code.png') }}">
</body>
-
蓝图之大型系统
项目结构百度盘 mhs5
总结:
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的概念
g对象
-
g对象的特性
当前请求内你设置就可以取,必须先设置,后取,当前请求可以取无限次
就算你当前的请求,设置了,如果不取,其他请求过来,也取不到
from flask import Flask, g, url_for, redirect
app = Flask(__name__)
@app.before_request
def after1():
g.name = 'aaa'
@app.route('/test')
def test():
print(g.name) # 可以取
return redirect(url_for('login'))
@app.route('/login')
def login():
print(g.name) # 也可以取,因为g对象是在每个请求来都设置了
return 'login'
# g对象的取值是针对一次请求来定的
-
g对象和session的区别
session对象是可以跨request的,只要session还未失效,不同的request的请求会获取到同一个session,
但是g对象不是,g对象不需要管过期时间,请求一次就g对象就改变了一次,或者重新赋值了一次
信号
-
安装
pip3 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,render_template
app = Flask(__name__)
# 往信号中注册函数
#1给信号绑定要执行的函数
#无需管调用,因为flask,已经给我们设置调用点
def func(*args,**kwargs):
print('触发型号',args,kwargs)
#与该信号进行绑定
signals.request_started.connect(func)
# signals.request_started.send
# 触发信号: 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 "视图"
if __name__ == '__main__':
# app.wsgi_app
app.run()
-
自定义信号
from flask import Flask, current_app, flash, render_template
from flask.signals import _signals
app = Flask(import_name=__name__)
# 自定义信号
xxxxx = _signals.signal('xxxxx')
def func(sender, *args, **kwargs):
print(sender)
# 自定义信号中注册函数
xxxxx.connect(func)
@app.route("/x")
def index():
# 触发信号
xxxxx.send('123123', k1='v1')
return 'Index'
if __name__ == '__main__':
app.run()


浙公网安备 33010602011771号