Flask教程-模版

Posted Python那些事

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask教程-模版相关的知识,希望对你有一定的参考价值。


https://segmentfault.com/a/1190000011370651


我们可以让绑定到某个URL的函数返回html。比如下面的代码中,hello()函数会返回由<h1>包裹的Hello World字符串。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
  return '<html><body><h1>Hello World</h1></body></html>'

if __name__ == '__main__':
  app.run(debug = True)

但大家看得出,这样直接通过python代码返回HTML内容显得很笨,尤其当我们碰到需要对输入变量做条件判断和循环时,我们经常需要做字符串嵌入拼接这种体力活。


这种情况下,我们需要利用Flask自带的Jinja2模版引擎。我们可以通过render_template()来渲染HTML文件,而不是直接把HTML直接硬编码在python代码中。比如:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
  return render_template('hello.html')

if __name__ == '__main__':
  app.run(debug = True)

Flask会默认尝试从脚本执行目录下的templates文件夹中寻找HTML模版文件:

--脚本目录
 |_ Hello.py
 |_ templates
    |_hello.html

"web模版系统" 是指一个变量部分可以被动态替换的HTML代码的系统。 web模版系统包含一个模版引擎,一种数据源和一个模版处理工具。


Flask使用Jinja2模版引擎,web模版包含有按HTML语法书写的脚本和由变量或表达式构成的动态内容的占位符。这些占位符会在模版渲染时被替换成需要展示的动态内容。


我们可以把如下内容保存为hello.html:

<!doctype html>
<html>
  <body>
     <h1>Hello {{ name }}!</h1>
  </body>
</html>

然后运行下面的Python代码:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello/<user>')
def hello_name(user):
  return render_template('hello.html', name = user)

if __name__ == '__main__':
  app.run(debug = True)


我们可以看到在模版的{{ name }} 部分,替换成了变量mvl。


Jinja2使用如下的占位符语法:


  • {% ... %} 声明

  • {{ ... }} 用于表达式直接把结果输出

  • {# ... #} 用于注释, 将不会在模版引擎渲染结果中输出

  • # ... ## 行注释

下面的例子展示了模版中条件语句的使用。


hello_name()方法接收一个整型参数,传递给hello.html模版,其中,masks变量接受到了这个整型变量, 并进行判断比较,是否大于50,然后进行不同的渲染。


Python程序如下:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello/<int:score>')
def hello_name(score):
  return render_template('hello.html', marks = score)

if __name__ == '__main__':
  app.run(debug = True)

模版hello.html如下:

<!doctype html>
<html>
  <body>

     {% if marks>50 %}
     <h1> Your result is pass!</h1>
     {% else %}
     <h1>Your result is fail</h1>
     {% endif %}

  </body>
</html>

注意, if-else和endif语句被包裹在{%..%}之中。


启动脚本并分别在浏览器输入http://localhost/hello/60 和 http://localhost/hello/30,观察模版不同的渲染结果。


Python中的循环语法也可以在模版中实现。下面的程序中,当请求 http://localhost:5000/result 时,result()方法就向模版result.html发送了一个字典对象用于渲染。然后result.html使用for循环把字典result的键值对渲染到html表格中。


Python程序如下:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/result')
def result():
  dict = {'phy':50,'che':60,'maths':70}
  return render_template('result.html', result = dict)

if __name__ == '__main__':
  app.run(debug = True)

把下面result.html模版文件保存到默认templates模版文件夹中。

<!doctype html>
<html>
  <body>

     <table border = 1>
        {% for key, value in result.iteritems() %}

           <tr>
              <th> {{ key }} </th>
              <td> {{ value }} </td>
           </tr>

        {% endfor %}
     </table>

  </body>
</html>

这里, for循环声明语句被用{%..%}包裹了起来,键值对取值的部分被用{{ }}包裹。程序开始执行后,我们可以打开浏览器,看看 http://localhost:5000/result的输出。


看完本文有收获?请转发分享给更多人

关注「Python那些事」,做全栈开发工程师

以上是关于Flask教程-模版的主要内容,如果未能解决你的问题,请参考以下文章

网站后端_Python+Flask.0014.FLASK模版相关之使用JinJa2模版渲染?

flask 模版if 语句和for语句

使用Visual Studio Code自定义代码模版

OpenGL ES 学习教程(十三) Stencil_TEST(模板缓冲测试)

使用 Git 来管理 Xcode 中的代码片段

flask之ssti模版注入从零到入门