为Flask模板中所有未定义的jinja2变量设置默认值

2024-10-02 20:30:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个flask应用程序,可以查询Amadeus自助API中的航班信息。这通常效果很好。API返回行程的JSON、行程段以及城市、航空公司和飞机代码的字典。我的结果模板遍历行程及其分段,并使用包含的字典查找代码

但有时JSON格式不正确或缺少数据,这会完全破坏html的呈现,导致500错误。这是最近的一个例子

我的模板中的相关代码:

live_results.html

<p> {{ flights.dictionaries.carriers[segment.carrierCode].title() }}&nbsp;&nbsp;Flight {{ segment.number }}
   <br><span class="w3-text-gray">{{ flights.dictionaries.aircraft[segment.aircraft.code].title() }}
   </span></p>

对于某些飞行段,flights.dictionaries.aircraft缺少飞机代码的键(在本例中为“32Q”)。我的服务器日志中产生的错误:

Exception on /live_results [GET]
Traceback (most recent call last):
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  
File "/home/SteveZ/dragonfly/fly_app/routes.py", line 313, in live_results
    code_dict=code_dict
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/templating.py", line 140, in render_template
    ctx.app,
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/flask/templating.py", line 120, in _render
    rv = template.render(context)
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  
File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  
File "/home/SteveZ/dragonfly/fly_app/templates/live_results.html", line 1, in top-level template code
    {% extends "base.html" %}
  
File "/home/SteveZ/dragonfly/fly_app/templates/base.html", line 42, in top-level template code
    {% block content %}{% endblock %}
  
File "/home/SteveZ/dragonfly/fly_app/templates/live_results.html", line 104, in block "content"
    <br><span class="w3-text-gray">{{ flights.dictionaries.aircraft[segment.aircraft.code].title() }}

File "/home/SteveZ/.virtualenvs/WOF_env/lib/python3.6/site-packages/jinja2/environment.py", line 471, in getattr
    return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'dict object' has no attribute '32Q'

通过为受影响的变量设置jinja2默认值,我修复了这个特定情况。但这相当于在错误发生后做出反应

我希望通过将所有未定义的变量设置为默认字符串值(空字符串或“未定义”)来防止代码出现类似错误。有办法吗?可能是使用Flask.jinja_env或Flask如何解析JSON

最后,如果可以处理这些错误,是否有方法在错误发生时进行记录


Tags: inpyenvappflaskhomelibpackages