如果不使用模板的话,直接把界面的html文件字符串return
,会使得python文件里包含过多的静态文件,使得项目变得不可维护。
#!/usr/bin/env python3
# -*-coding:utf8-*-
# power by jedi
from flask import Flask, request
app = Flask(__name__)
@app.route("/login", methods=["GET"])
def login():
html = " \
"" \
"请输入用户名 " \
"请输入密码 " \
" " \
"
" \
""
return html
# post response page
@app.route("/login", methods=["POST"])
def login_post():
username = request.form.get("username")
password = request.form.get("password")
if username == "jedi" and password == "123456":
return "login seccuss"
else:
return "login failed"
if __name__ == '__main__':
app.run(debug=True)
我们要把页面html部分独立出来,flask提供了jinja2模板引擎来实现。
jinja2模板引擎同样符合flask最基础的约定,即众多配置中都有一个基础的默认值,相对jinja2来说,有一个最重要的默认值,即模板文件放在templates文件夹,这个文件夹虽然可以自定义,但目前来说,使用默认值已经足够了。
如果需要自定义模板文件夹,可以在@app.route()的参数中设置。
先在当前项目的目录下创建一个目录templates
(默认,可以更改),然后把静态的html文本分离出来,新建一个login.html
。
<html>
<head>
<title>welcome loging, myBlogtitle>
head>
<body>
<form method="post">
<table>
<tr>
<td>usernametd><td><input type="text" name="username">td>
tr>
<tr>
<td>passwordtd><td><input type="password" name="password">td>
tr>
<tr>
<td><input type="submit" name="submit">td>
tr>
table>
form>
body>
html>
然后在上级的目录新建login.py
from flask import Flask, render_template#页头,导入渲染函数
app = Flask(__name__)
@app.route("/login", methods=["GET","POST"])
def loging():
return render_template("/login.html")
if __name__ == '__main__':
app.run(debug=True)
自定义网页标题和向木板中传入参数:
python脚本
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html", site_name="my_blog")
if __name__ == '__main__':
app.run(debug=True)
index.html
文件:
<!DOCTYPE html>
<html>
<head>
<title>{{site_name}}</title>
</head>
<body>
<h3>This site name is : {{site_name}}</h3>
</body>
</html>
界面返回This site name is : my_blog
,同时网页的title也变成my_blog
flask的render_template函数支持多参数,其中函数的第一个参数为模板名,之后可以提供若干参数,均为键值对,为模板中的变量提供数据。如此例子中,为site_name提供了myblog的值,而模板内使用{{参数名}}来表示一个变量
inja2模板还提供了一些变量过滤器
<html>
<head>
<meta charset="UTF-8">
<title>{{site_name|upper}}title>
head>
<body>
<h1>这个站点的名字为 {{site_name}} h1>
body>
html>
safe 不转义
capitalize 首字母大写
lower 转换为小写
upper 转换为大写
trim 去收尾空格
striptages 去除html标签
if 语句
<html>
<head>
<title>{{site_name}}title>
head>
<body>
<h3>This site name is : {{site_name}}h3>
<h4>if :h4>
{%if name == "test"%}
this is {{name}}
{%else%}
hello {{name}}
{%endif%}
body>
html>
for 语句
if and for 语句应用
index.html
<html>
<head>
<title>{{site_name}}title>
head>
<body>
<h3>This site name is : {{site_name}}h3>
<h4>if :h4>
{%if name == "test"%}
this is {{name}}
{%else%}
hello {{name}}
{%endif%}
<h4>for :h4>
{%for key, value in blogs.items()%}
<p>{{key}}----{{value}}p>
{%endfor%}
body>
html>
index.py
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def index():
names = {
"username": "jedi",
"password": "123456"
}
return render_template("index.html", site_name="my_blog", name="test1", blogs=names)
if __name__ == '__main__':
app.run(debug=True)
网页输出
This site name is : my_blog
if :
hello test1
for :
username----jedi
password----123456
首先需要创建一个基模板
<html>
<head>
{%block head%}
<title>
{%block title%}{%endblock%}
title>
{%endblock%}
head>
<body>
{%block body%}{%endblock%}
body>
html>
其中的block
标签表示可以任意的在子模板中修改
下面的是子模板代码
{% extends "base.html" %}
{% block title %}{{site_name[2:]}}{% endblock %}
{% block head %}
{{super()}}
{% endblock %}
{% block body %}
<h1>这个站点的名字为 {{site_name}} h1>
{% endblock %}