Flask中如何在渲染页面前读取what's new页面的版本号以实现条件显示?
实现方案
完全不需要渲染页面即可拿到版本号:
whats_new.html是存储在服务器本地的模板文件,你写入meta标签的版本号是静态内容,直接读取模板的原始文本、正则提取对应值即可,全程不触发模板渲染流程。
具体实现
先修正原有伪代码的语法问题,再补全核心的版本读取逻辑,完整示例如下:
- 导入需要的依赖:
import re from flask import current_app, redirect, url_for, render_template, Blueprint
- 登录路由逻辑(修正原伪代码的语法错误):
bp = Blueprint('main', __name__) @bp.route("/login", methods=['GET', 'POST']) def login(): if login_user(user, password): return redirect(url_for('whats_new'))
whats_new页面的路由逻辑:
@bp.route("/whats-new") def whats_new(): current_ver = get_version_from_webpage() # 阈值按你的实际需求调整即可 if current_ver > 3: return render_template('whats_new.html') # 不能直接跳转模板名,要跳对应首页的路由 return redirect(url_for('home'))
- 核心的版本读取函数实现:
def get_version_from_webpage(): # 自动获取whats_new.html的本地磁盘路径,无需硬编码模板目录 template_file = current_app.jinja_env.get_template('whats_new.html') # 直接打开读取原始模板文本,完全不做渲染处理 with open(template_file.filename, 'r', encoding='utf-8') as f: raw_content = f.read() # 正则匹配meta标签的版本号,兼容单/双引号、属性顺序变化的情况 ver_pattern = re.compile(r'<meta\s+[^>]*name=["\']version["\'][^>]*content=["\'](\d+)["\']') match = ver_pattern.search(raw_content) # 匹配不到时返回默认值,避免代码报错 return int(match.group(1)) if match else 0
补充说明
- 如果版本号带小数点(比如
4.1.0),可以把正则中的\d+替换为[\d.]+,返回值转成float即可 - 该方案完全符合低变更成本的要求:后续调整版本号只需要修改
whats_new.html中meta标签的content属性值即可,不需要改动任何后端代码 - 性能层面完全够用:模板文件体积极小,直接读磁盘的开销可以忽略;如果站点访问量较高,可以加一层短时间的内存缓存(比如缓存30秒),兼顾性能和修改模板后快速生效的需求
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

