在前面的示例中,想要在模板里显示数据,只能通过在render_template函数里传参数来解决。但对于flask的上下文变量和自定义上下文变量,则不必如此,你可以直接在模板里使用他们。
请求对象request,携带了大量有关请求的信息,比如请求的path,url,参数,你可以在模板里直接使用他们,新建index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>flask</title>
</head>
<body>
{{ "你请求的path:" + request.path }}
</body>
</html>
新建app.py文件
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/index')
def index():
return render_template("index.html")
if __name__ == '__main__':
app.run()
在浏览器里访问http://127.0.0.1:5000/index,页面显示内容如下
你请求的path:/index
会话对象session保存当前会话的状态,同样可以在模板里使用
from flask import Flask, render_template, session
app = Flask(__name__)
app.secret_key = '123456'
@app.route('/index')
def index():
session['username'] = 'dongsheng'
return render_template("index.html")
if __name__ == '__main__':
app.run(debug=True)
模板代码:
{{ "用户名:" + session.username }}
flask的全局变量g,一般用于保存请求中会用到的全局对象
from flask import Flask, render_template, session, g
app = Flask(__name__)
app.secret_key = '123456'
@app.route('/index')
def index():
g.user = 'admin'
return render_template("index.html")
if __name__ == '__main__':
app.run(debug=True)
模板代码
{{ "当前对象:" + g.user }}
url_for被用来构建url,某一天,你修改了一个视图所处理的url后,url_for可以让你无需修改任何前端代码。
from flask import Flask, render_template, session, g
app = Flask(__name__)
app.secret_key = '123456'
@app.route('/index')
def index():
return render_template("index.html")
@app.route('/login')
def login():
return 'login'
if __name__ == '__main__':
app.run(debug=True)
我增加了一个login视图,用来处理path为/login的视图,在前端模板里,我放置一个连接
<a href="{{ url_for('login') }}">login</a>
注意,url_for函数里的login指向的是函数login。如果某天,你修改了登录用的path
@app.route('/user/login')
def login():
return 'login'
那么前端a标签里的href属性也会随之修改,url_for是通过与视图函数关联来投建url地址的。
get_flashed_messages 用于获取后端flash的消息用于展示,它也可以在模板里使用
from flask import Flask, render_template, session, g, flash
app = Flask(__name__)
app.secret_key = '123456'
@app.route('/index')
def index():
flash("登录成功")
return render_template("index.html")
@app.route('/login')
def login():
return 'login'
if __name__ == '__main__':
app.run(debug=True)
模板代码
<body>
{% for message in get_flashed_messages() %}
<div class=flash>{{ message }}</div>
{% endfor %}
<a href="{{ url_for('login') }}">login</a>
</body>
使用context_processor装饰器,可以自定义上下文变量
@app.context_processor
def info():
return dict(appname='coolpython')
在模板里使用时,和函数无关,关键要求是被装饰的函数返回一个字典,在模板里,直接使用字典的key就可以获得对应的value
。
模板代码
<p>{{ "appname: " + appname}}</p>
原理和变量一样,只是返回的字典里,value是函数
@app.context_processor
def info():
def show_time(format="%Y-%m-%d %H:%M:%S"):
return datetime.now().strftime(format)
return dict(show_time=show_time)
模板代码
<p>{{ "当前时间: " + show_time()}}</p>
QQ交流群: 211426309