如何在Tornado模板中自动将所有None值替换为空字符串
解决方案
针对Tornado模板引擎自动将None值替换为空字符串的需求,可选择以下两种低成本方案,无需逐个修改模板字段:
方案1:全局替换Tornado字符串转换逻辑(推荐,零模板修改)
通过猴子补丁修改Tornado模板底层的字符串转换函数,全局所有模板渲染时都会自动把None转为空字符串,原有代码和模板完全不需要调整。
在初始化模板Loader之前添加以下代码即可:
from tornado import template import functools # 保留原始转换函数 original_to_unicode = template.to_unicode # 自定义转换逻辑,None直接返回空字符串 @functools.wraps(original_to_unicode) def custom_to_unicode(value, encoding='utf-8', errors='strict'): if value is None: return '' return original_to_unicode(value, encoding, errors) # 替换原生转换函数 template.to_unicode = custom_to_unicode
方案2:对传入模板的对象做代理包装(无全局侵入)
如果不希望修改全局Tornado行为,可编写通用代理类,仅对传入模板的SQLAlchemy模型对象做属性拦截,自动将None属性转为空字符串:
class NoneToEmptyProxy: def __init__(self, obj): self._obj = obj def __getattr__(self, name): value = getattr(self._obj, name) if value is None: return '' # 自动代理关联的其他SQLAlchemy模型对象 if hasattr(value, '__table__'): return NoneToEmptyProxy(value) return value
调用generate传参时,给需要处理的对象套一层代理即可:
content = template.generate( user = NoneToEmptyProxy(user), # 其他需要处理的对象同理包装 # order = NoneToEmptyProxy(order), # address = NoneToEmptyProxy(address) )
两种方案都可以覆盖所有字段的None处理,不需要修改任何模板内的变量写法。
内容的提问来源于stack exchange,提问作者mtoloo
相关产品推荐
相关产品推荐

