当前位置: 首页>编程语言>正文

Flask Web框架的使用-静态文件和模版


Flask Web框架的使用-静态文件和模版

  • 一、前言
  • 二、静态文件
  • 三、模版
  • 1. 渲染模版
  • 2.变量
  • 3.控件



一、前言

  • 个人主页: ζ小菜鸡
  • 大家好我是ζ小菜鸡,让我们一起来学习Flask Web框架的使用-静态文件和模版。
  • 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)

二、静态文件

  动态Web 应用也会需要静态文件,通常是CSS和JavaScript 文件。理想状态下,你已经配置好Web 服务器来提供静态文件,但是在开发中,Flask 也可以做到。只是在你的包中或者是模块的所在目录中创建一个名为static 的文件夹,在应用中使用“/static”即可访问。

  给静态文件生成URL,使用特殊的“/static” 端点名:

url_for("static",filename="style.css")

  这个文件应该存储在文件系统上的“static/style.css”。


三、模版

  模版是一个包含响应文件的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模版,Flask 使用了一个名为 “Jinja2” 的强大模版引擎。

1. 渲染模版

  默认情况,Flask在程序文件夹中的templates 子文件夹中寻找模版。下面通过一个实例学习如何渲染模版。

  示例:渲染模版

  创建 04 文件夹,在该文件夹中创建templates 文件夹,然后创建2个文件夹,分别命名为index.html和user.html,最后在04文件夹下创建render.py文件,渲染这些模版。目录结构如下所示:

Flask Web框架的使用-静态文件和模版,Flask Web框架的使用-静态文件和模版_前端,第1张

  templates/index.html 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Hello world!</h1>
</body>
</html>

  templates/user.html 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Hello,{{username}}!</h1>
</body>
</html>

  render.py 代码如下:

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def hello_world():
    return render_template("index.html")


@app.route("/user/<username>")
def show_user_profile(username):
    # 显示该用户的用户信息
    return render_template("user.html", name=username)


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

  Flask 提供的 render_template() 函数把 “Jinja2” 模版引擎集成到了程序中。render_template() 函数的第一个参数是模板的文件名。随后的参数都是键值对,表示模版中变量对应的真实值。在这段代码中,第二个模板收到一个名为name的变量。“name = name” 是关键字参数,这类关键字参数很常见,但如果你不熟悉它们的话,可能会觉得迷惑且难难以理解。左边“name”表示参数名,就是模板中使用的占位符;右边的“name”是当前作用域中的变量,表示同名参数的值。

  运行效果如下图所示:

Flask Web框架的使用-静态文件和模版,Flask Web框架的使用-静态文件和模版_python_02,第2张

Flask Web框架的使用-静态文件和模版,Flask Web框架的使用-静态文件和模版_python_03,第3张


2.变量

  在模板中使用的“{{username}}” 结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。 “Jinja2”能识别所有类型的变量,甚至是一些复杂的类型,例如,列表、字典、和对象。在模板中使用变量的一些示例如下:

<p>从字典中取一个值:{{mydict["key"]}}.</p>
<p>从一个列表中取一个值:{{mylist[3]}}.</p>
<P>从一个列表中取一个带索引的值{{mylist[myintvar]}}.</P>
<p>从一个对象的方法中去一个值:{{myobj.somemethod()}}.</p>

  可以使用过滤器修改变量,过滤器名添加在变量之后,中间使用竖线分隔。例如,下述模板以首字母大写的形式显示变量 name 的值:

Hello,{{name|capitalize}}

  Jinja2 提供的部分常用过滤器如下表所示:

名称

说明

safe

渲染值时不转义

capitalize

把首字母转成大写,其他字母转成小写

lower

把值转成小写的形式

upper

把值转成大写的形式

title

把值中的每个单词的首字母都换成大写

trim

把值的收尾空格去掉

striptags

渲染之前把值中的所有的HTML 标签都删掉

  safe过滤器值得特别说明一下。默认情况下,出于安全考虑,Jinja2 会转义所有变量。如果个交量的值为“<hI>HeHo<hI>”,Jimja2会将其渲染成“'&lt;hl&gt;Hello&lt;/hl&gt;”,浏览器能显示这个hI元素,但不会进行解释。很多情况下需要显示变量中存储的HTML代码,这时就可以使用safe 过滤器。


3.控件

  Jinja2 提供了多种控制结构,可用来改变模版的渲染流程。接下来我们将使用简单的例子介绍其中最有用的控制结构。

  下面这个例子展示了如何在模板中使用条件控制语句:

{% if user %}
Hello,{{user}}
{% else %}
Hello,Stranger
{% endif %}

  另外一种常见需求是在模板中渲染一组元素。如下所示展示了如何使用for循环实现这一需求:

<ul>
    {% for comment in comments %}
    <li>
        { {comment} }
    </li>
    {% endfor %}
</ul>

  Jinja2 还支持宏。宏类似于 Python 代码中的函数。例如:

{% macro render_comment(comment) %}
<li>
    { {comment} }
</li>
{% endmacro %}
<ul>
    {% for comment in comments %}
    <li>
        { {comment} }
    </li>
    {% endfor %}
</ul>

  为了独立使用宏,我们可以将其保存在单独的文件中,然后在需要使用的模板中导入:

{% import "macros.html" as macros %}
<ul>
    {% for comment in comments %}
    <li>
        { {comment} }
    </li>
    {% endfor %}
</ul>

  需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有的模板中,以避免重复:

{% include "common.html" %}

  另一种重复使用代码的强大方式的模板继承,它类似于Python 代码中的类继承。首先,创建一个名为base.html 的基模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% block head %}
    <title>{% block title %}{% endblock %} - My Application</title>
    {% endblock %}
</head>
<body>
{% block boby %}
{% endblock %}
</body>
</html>

  block 标签定义的元素在衍生模板中修改,在本例中,我们定义了名为head、title和body 的块。注意,title 包含在head 中,下面这个示例是基模版的衍生模版:

{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
{{ super()}}
<style>
</style>
{% endblock %}
{% block boby %}
<h1>Hello,World!</h1>
{% endblock %}

  extends 指令声明这个模板衍生自base.html。在extends 指令之后,基模板中的3 个块被重新定义,模板引擎会将其插入适当的位置。注意新定义的head块,在基模板中其内容不是空的,所以使用super()函数获取原来内容。


  Flask Web框架的使用-静态文件和模版,到此就结束了,感谢大家阅读,如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)




https://www.xamrdz.com/lan/56w1934208.html

相关文章: