零、回顾
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run()
一、模板的简单使用
一个Web有很多样式,若都在return语句添加,导致可读性差、不易维护,这时需要使用模板;
在当前项目中创建一个templates文件夹,在该目录下创建.html文件,将样式要求卸载里面;
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>{{content}}</h1>
</body>
</html>
回到flaskApp.py文件,导入render_template方法,并将return语句接模板返回的字符串;
#-*-coding:utf8-*-
# 导入Flask类
from flask import Flask, request, url_for, render_template
from models import User
# 实例化一个Flask对象,参数是模块名或包名,Flask根据该参数确定应用的路径、静态文件和模板文件夹的默认路径
app = Flask(__name__)
# 应用的路由部分,指定视图函数
@app.route('/')
def hello_world():
# 可运行,但可读性差
# return '<h1>hello World</h1>'
content = "Hello world"
# render_template()方法渲染界面
return render_template("index.html", content=content)
# 运行Flask应用
if __name__ == '__main__':
app.run()
稍微复杂地,render_template方法返回类对象;
在当前目录下创建一个models.py文件,用以存放User类;
class User(object):
def __init__(self, user_id, user_name):
self.user_id = user_id
self.user_name = user_name
创建一个user_index.html文件;
其中,变量是由{{}}双花括号括起来的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello {{user.user_name}}</h1>
<h2>Your Id is {{user.user_id}}</h2>
</body>
</html>
再在index.py文件中添加一个路由;
#-*-coding:utf8-*-
from flask import Flask, request, url_for, render_template
from models import User
app = Flask(__name__)
@app.route('/user')
def user_index():
user=User(1, 'wencheng')
return render_template("user_index.html", user=user)
if __name__ == '__main__':
app.run()
二、条件语句
在HTML文件中,if, esle,endif语句都是用{%和%}括起来的;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if user%}
hello {{user.user_name}}
{% else %}
no this user
{% endif %}
</body>
</html>
三、循环语句
for, endfor语句用法同条件语句;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for user in users %}
{{user.user_id}} {{user.user_name}}<br>
{% endfor %}
</body>
</html>
再在flaskApp.py定义一个路由;
#-*-coding:utf8-*-
from flask import Flask, request, url_for, render_template
from models import User
app = Flask(__name__)
@app.route('/users')
def user_list():
users=[]
for i in range(1, 11):
user = User(i, 'wencheng' + str(i))
users.append(user)
return render_template("user_list.html", users=users)
if __name__ == '__main__':
app.run()
四、模板的继承
很多Web页面的头部导航部分、底部公司信息部分都是不变的;
可创建一个父类,将所有不变的功能方法定义在基类,;创建的子类可针对不同Web页面进行相应页面定义;
首先创建一个base.py文件,将标题和底部部分分别用div标签包围,中间可扩展部分使用block, endblock定义;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<h1>Header 极客学院</h1>
</div>
{%block content%}
{%endblock%}
<div>
<h1>Footer jikexueyuan</h1>
</div>
</body>
</html>
创建子类,命名为one_base.html和two_base.html文件,使用extends继承父类,使用block定义变化的部分;
{%extends "base.html"%}
{%block content%}
<h2>这是第二页</h2>
{%endblock%}
最后在flaskApp.py文件中创建一个新的路由;
#-*-coding:utf8-*-
from flask import Flask, request, url_for, render_template
from models import User
app = Flask(__name__)
@app.route('/one')
def one_base():
return render_template("one_base.html")
@app.route('/two')
def two_base():
return render_template("two_base.html")
if __name__ == '__main__':
app.run()