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 其他缺省全局变量

除了gsessionrequest之外,Flask还提供了configurl_for()功能,使开发者能够方便地访问应用程序配置和生成URL。

2.5 案例Code

from flask import Flask, session, render_template, request, g
from datetime import timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
@app.route('/')
def hello(username):
session['username'] = username
g.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_processor
def my_context_processor():
def add(n):
return n + n
return dict(username='zhangsan', func_add=add)

通过环境处理器,可以方便地为模板变量添加支持。例如,定义了usernamefunc_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 + b
app.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_request
def do_db():
if 'db' not in g:
g.db = connect_db()
@app.teardown_request
def teardown_db(exception):
db = g.pop('db', None)
if db is not None:
print('关闭游标')
db.close()

通过上述钩子函数,可以确保数据库连接在每次请求开始时自动建立,并在请求结束后正确关闭。

上一篇:vscode--使用教程
下一篇:Flask--session

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月19日 15时38分06秒