flask模板---上下文环境

在前面的示例中,想要在模板里显示数据,只能通过在render_template函数里传参数来解决。但对于flask的上下文变量和自定义上下文变量,则不必如此,你可以直接在模板里使用他们。

1. request

请求对象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

2. session

会话对象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 }}

3. g

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 }}

4. url_for

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地址的。

5. get_flashed_messages

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>

6. 自定义上下文变量

使用context_processor装饰器,可以自定义上下文变量

@app.context_processor
def info():
    return dict(appname='coolpython')

在模板里使用时,和函数无关,关键要求是被装饰的函数返回一个字典,在模板里,直接使用字典的key就可以获得对应的value

模板代码

<p>{{ "appname: " + appname}}</p>

7.自定义上下文函数

原理和变量一样,只是返回的字典里,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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案