
Flask模板--环境管理
发布日期:2021-05-14 12:21:24
浏览次数:12
分类:精选文章
本文共 2912 字,大约阅读时间需要 9 分钟。
1. 上下文简介
上下文(Context)是Flask框架中处理状态相关问题的核心机制。它通常包括在内存中保持的全局变量、程序运行状态与相关资源的总和以及操作系统在调度或进程切换时需要保存的值。
2. 标准环境
2.1 应用上下文变量
应用上下文变量是所有程序内部都可访问的资源,主要包括:
- current_app:表示当前正在运行的程序实例,多个程序会有多个current_app,重启后不会成为新实例
- g:一个代理对象,可访问应用程序的配置、上下文和其他全局变量
2.2 请求上下文变量
请求上下文变量则仅在特定的HTTP请求内可访问,包括:
- request:当前HTTP请求的代理对象,可用于访问请求的详细信息
- session:表示用户会话的代理对象,可跨请求使用,只要当前会话未过期
2.3 参考博客
如需进一步了解Flask上下文,可以参考以下博客:
- https://segmentfault.com/a/1190000017814222
- https://blog.csdn.net/m0_37323771/article/details/80645100
2.4 其他缺省全局变量
除了g
、session
和request
之外,Flask还提供了config
和url_for()
功能,使开发者能够方便地访问应用程序配置和生成URL。
2.5 案例Code
from flask import Flask, session, render_template, request, gfrom datetime import timedeltaapp = Flask(__name__)app.config['SECRET_KEY'] = os.urandom(24)app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) @app.route('/')def hello(username):session['username'] = usernameg.id = request.args.get('id')return render_template('session.html') if name == 'main':app.run(debug=True)
以下模板示例展示了如何在视图函数中使用上下文变量:
Document {{ session }} {{ session.username | default('游客') }} {{ request }} {{ request.args["id"] | default('id') }} {{ g }} {{ g.id }} {{ g['id']| default('你好') }}
3. 环境处理器
环境处理器(Context Processor)是一个装饰器,用于在模板渲染前将新的变量引入模板环境中。通过定义@app.context_processor
装饰器,可以灵活地扩展模板上下文。
@app.route('/')def demo(): return render_template('demo.html')@app.context_processordef my_context_processor(): def add(n): return n + n return dict(username='zhangsan', func_add=add)
通过环境处理器,可以方便地为模板变量添加支持。例如,定义了username
和func_add
后,模板就可以直接使用:
{{ username }} {{ func_add(4) }}
4. 全局函数
4.1 内置全局函数
Flask提供了多个内置全局函数,方便在模板中使用:
dict()
用于生成字典型变量joiner()
用于自定义分隔符函数cycler()
用于循环遍历多个值
{% set sep = joiner(' | ') %}{% for item in range(1,10) %} {{ sep() }}{{ item }}{% endfor %}
4.2 自定义全局函数
可以通过两种方式在模板中注册自定义全局函数:
- 使用
@app.template_global
装饰器 - 使用
app.add_template_global
方法
示例:
@app.template_global('func1')def my_add(a, b): return a + b def my_add(a, b):return a + bapp.add_template_global(my_add, 'func1')
在模板中可以使用:
{{ func1(2, 3) | default('没有调用函数') }}
5. 钩子函数
5.1 使用场景
钩子函数(Hooks)广泛应用于与请求相关的任务:
- 在请求开始时,建立数据库连接
- 在请求开始时,执行权限校验
- 在请求结束时,指定数据的交互格式
5.2 常用钩子函数
before_first_request
:在处理第一个请求前执行before_request
:在请求进入视图函数前执行after_request
:在请求处理后执行teardown_request
:在每次请求后执行teardown_appcontext
:在每次请求后执行(异常处理)template_filter
:用于注册模板过滤器context_processor
:见上文errorhandler
:异常响应处理
5.3 g与钩子函数
若在钩子函数中操作数据库,可以通过g
来保存和管理数据库连接。
def connect_db(): conn = pymysql.connect(**{ 'host':'47.96.67.53', 'user':'root', 'password':'123456', 'port': 3306, 'database':'db01' }) return conn.cursor()@app.before_requestdef do_db(): if 'db' not in g: g.db = connect_db()@app.teardown_requestdef teardown_db(exception): db = g.pop('db', None) if db is not None: print('关闭游标') db.close()
通过上述钩子函数,可以确保数据库连接在每次请求开始时自动建立,并在请求结束后正确关闭。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月19日 15时38分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Nginx Location
2019-03-11
解决github Git clone 慢的问题
2019-03-11
一张图搞定RPC框架核心原理
2019-03-11
Scala中的包
2019-03-11
参加阿里的Java面试经验
2019-03-11
Python微信公众号
2019-03-11
他来了他来了,他带着云栖大会的免费门票走来了
2019-03-11
Oracle笔记
2019-03-11
如何复用外部shell脚本
2019-03-11
JAVA集合类Collection浅析
2019-03-11
获取linux 主机cpu类型
2019-03-11
限流的算法有哪些?
2019-03-11
Failed to notify build listener.
2019-03-11
TextWiew单个线条
2019-03-11
Android Studio updating indices 一直刷新和闪烁
2019-03-11
个人购买服务器问题?
2019-03-11
pwntools编写技巧
2019-03-11
How2Heap笔记(三)
2019-03-11
go--microSocket服务端 php客户端
2019-03-11
如何修改Pspice元件库中元件的模型参数?
2019-03-11