web分为前端和后端,而模板就属于前端,也就是显示给用户来看的页面。
当要制作的网站都多个页面时,为了保持同一的风格,就会用到模板。
渲染模板
渲染是指把从服务器获取的信息呈现到web浏览器上的过程(个人理解)。
flask有自己的渲染机制,所以在使用Jinja2模板之前要先导入render_template
from flask import Flask, render_template
在路由函数的返回值处就可以调用render_template()函数渲染页面了
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/user')
def user():
return render_template('user.html')
这里为了遵守PEP8 Python编程规范,每个函数之间要空两行。(为什么要遵守这种规范,因为Python的代码块不使用{}来分隔,而是使用代码行缩进进行分块,这样很容造成错误)
在定义好了路由函数后,就要创建一个user.html页面,内容随便写就行,然后再浏览器里打上访问路径即可,例如:
创建基础模板
页面之间是允许存在继承关系的,所以我们可以定义一个基础模板,它的作用一般是定义网站的风格,也有人管这叫皮肤,哈哈。
先创建一个base.html文件,并定义布局,在flask中叫 “块”(block)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block head %}
<title>{% block title %}{% endblock %} - My Application</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
使用过其他后台语言的应该就知道了,{%%}中间放的python代码,这里使用{% block name%}{% endblock %}结构来构建块。
name,是你给块起的名字,在子模板(也有叫衍生模板的)中向其中添加内容,如果少了某个块页面会有问题,所以一定注意布局。
子模板
基础模板有了,子模板继承基础模板就可以实现统一风格的网页了。修改一下user.html文件。
{% extends "bootstrap/base.html" %}
{% block title %}艺品天成{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Flasky</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/user">首页</a></li>
<li><a href="/AboutUs">关于我们</a></li>
</ul>
</div>
</div>
</div>
{% endblock %}
{% block content %}
<div class="container">
<div class="page-header">
<h1>Hello, {{ name }}!</h1>
</div>
</div>
{% endblock %}
再看看图解
自定义错误页面
先说一下错误页面,常见的有两种,404和500。
404:代表没找到请求的资源路径。
500:代表有未处理的异常。
通过继承基础模板,创建一个404.html页面,用来表示访问出错的页面。
{% extends "base.html" %}
{% block title %} Flasky - Page Not Found{% endblock %}
{% block body %}
<div class="page-header">
<h1>Page Not Found.</h1>
</div>
{% endblock %}
在body块中可以自定义页面内容了。
还有一个问题,虽然404页面做完了,但是服务器怎么知道是不是出错了呢,需要在后端代码中添加一个处理错误的路由函数。