"with"语句如何在Flask(Jinja2)中起作用?

paw*_*cki 6 python jinja2 flask

在Python中,您可以使用这样的with语句(源代码):

class controlled_execution:
    def __enter__(self):
        # set things up
        return thing
    def __exit__(self, type, value, traceback):
        # tear things down

with controlled_execution() as thing:
     # some code
Run Code Online (Sandbox Code Playgroud)

在Flask/Jinja2中,使用flash消息的标准过程如下():

{% with messages = get_flashed_messages() %}
  {% if messages %}
    {% for message in messages %}
      <!-- do stuff with `message` -->
    {% endfor %}        
  {% endif %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)

我想知道{% with messages = get_flashed_messages() %}语法方面的工作原理.

我无法在纯Python中重新创建它:

  • with messages = get_flashed_messages(): pass 加薪 SyntaxError
  • with get_flashed_messages() as messages: pass 加薪 AttributeError: __exit__

(我get_flashed_messagesflask两种情况下都进口了).

Shr*_*dha 11

{% with %} Jinja 中的语句允许您定义变量,但使用 {% endwith %}

 陈述。例如 :

{% with myvar=1 %}
...
{% endwith %} 
Run Code Online (Sandbox Code Playgroud)

在主体中声明的任何元素都可以访问 myvar 变量。

请参考 - https://www.webforefront.com/django/usebuiltinjinjastatements.html


Wol*_*lph 6

with在瓶说法是不一样的withPython中的语句.

在python中,等效的是:

messages = get_flashed_messages()
Run Code Online (Sandbox Code Playgroud)

  • 根据http://jinja.pocoo.org/docs/dev/extensions/#with-extension在Jinja2模板中使用"with"设置变量范围.当您使用"with"关闭时,您定义的变量将停止存在.这就像Zope模板中的"dtml-with",而不像Python上下文管理器中的"with". (3认同)