学flask的第四天之模板 - 图1

session

session是flask的一个内置对象,我们可以直接使用,但是在使用前我们需要为我们的session设置一个 SECRET_KEY 为了安全。设置方法也很简单:

  1. from flask import seesion
  2. app = Flask(__name__)
  3. app.secret_key = "jlskflsfgsdkfdsflasf"

然后我们可以像是字典那样直接将你想要存储的数据加进去:

  1. @app.route("/login", methods=["POST", "GET"])
  2. def login():
  3. if request.method == "GET":
  4. return render_template("login.html")
  5. elif request.method == "POST":
  6. username = request.form['username']
  7. session["username"] = username
  8. return username

当我们想要取出session中的值也是可以的,推荐使用 session.get() 方法去获取值:

  1. @app.route("/home")
  2. def home():
  3. username = None
  4. if session.get("username"):
  5. username = session.get("username")
  6. return render_template("home.html", username=username)

如果你想要删除session的话可以使用 session.pop()方法:

  1. @app.route("/logout")
  2. def logout():
  3. session.pop("username")
  4. return redirect(url_for("home"))

模板

 模板是flask中比较重要的一个组成部分,flask使用的是 jinjia2模板。我们在前面使用到了模板,其中使用函数 render_template 来渲染模板。
 同时在模板中有很多语法,首先说一下在模板中定义和使用变量的方法:{{ }} 我们用两个双引号来使用变量。{% %} 我们使用这个符号来声明变量。这两个是最基础的,其他都是在这两个上面扩展的。
例如继承语法:

  1. {% block name%}
  2. {% endblock %}

你只需要在父页面中使用block标签将需要子页面来自定义的东西包裹起来,其他的在子页面中都会自动继承父页面。在子页面中只需要这样:

  1. {%extend "xxx.html"%}

如果出现了多重继承的时候还想要保存上一次的效果你需要使用 {{ super()}}来达到目的。
还有判断:

  1. {% if %}
  2. {% elif %}
  3. {% else%}
  4. {%endif%}

还有循环:

  1. {for list in lists}
  2. {endfor}

你还可以使用include标签来将其他HTML文件包含进来:

  1. {% include%}

在jinjia2模板中,标签都是一对
同时在模板中,你可以使拥宏定义来实现你想要实现的功能:

  1. <body>
  2. {% macro hello() %}
  3. <h1>你好,世界</h1>
  4. {% endmacro %}
  5. {{ hello() }}

效果:学flask的第四天之模板 - 图2

宏定义就像是在python中定义函数一样,同样你是可以在定义的时候传递参数:

  1. <body>
  2. {% macro hello(name) %}
  3. <h1>你好,{{ name }}</h1>
  4. {% endmacro %}
  5. {{ hello("flask") }}
  6. </body>

效果:学flask的第四天之模板 - 图3

同时为了开发简单明了,我们可以将所有的宏定义写到一个文件中,在我们需要使用的时候直接引入就好:
学flask的第四天之模板 - 图4

  1. {% from "login.html" import hello %}
  2. {{ hello("python") }}

学flask的第四天之模板 - 图5
过滤器
变量可以通过过滤器修改。过滤器通过管道符号(|)与变量分隔,并且可以在括号中包含可选参数。可以链接多个过滤器。一个过滤器的输出应用于下一个过滤器。例如,将从变量名称和title-case中删除所有HTML标记输出{{name|striptags|title }}title(striptags(name))接受参数的过滤器在参数周围有括号,就像函数调用一样。例如:将使用逗号加入列表{{ listx|join(‘, ‘) }}str.join(‘, ‘, listx)。关于jinjia2的内置过滤器实在是有点多,所以推荐你去看官方文档选择你自己需要的 jinjia2内置过滤器
过滤器还有很多,还可以自己创建过滤器,后面会专门讲一下。