两天学会flask(六)---模板-上下文环境(3)(20分钟)

发布时间 2023-04-27 09:56:40作者: 家乐福的搬砖日常

flask模板---上下文环境

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

1. request

请求对象request,携带了大量有关请求的信息,比如请求的path,url,参数,你可以在模板里直接使用他们,新建index.html文件。

新建request.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()

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flask</title>
</head>
<body>
    {{ "你请求的path:" + request.path }}
</body>
</html>

2. session

会话对象session保存当前会话的状态,同样可以在模板里使用

from flask import Flask, render_template, session

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/index')
def index():
    session['username'] = 'liang'
    return render_template("index.html")

if __name__ == '__main__':
    app.run(debug=True)

session.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flask</title>
</head>
<body>
    {{ "你请求的path:" + request.path }}  <br>
    {{ "用户名:" + session.username }}
</body>
</html>

3. g

flask的全局变量g,一般用于保存请求中会用到的全局对象

from flask import Flask, render_template, session, g

app = Flask(__name__)
app.secret_key = '123456'

@app.route('/g')
def index():
    g.user = 'admin'
    return render_template("g.html")

if __name__ == '__main__':
    app.run(debug=True)

g.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ "当前对象:" + g.user }}
</body>
</html>

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)

url_for.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="{{ url_for('login') }}">login</a>
</body>
</html>

我增加了一个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)
get_flashed_messages.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% for message in get_flashed_messages() %}
        <div class=flash>{{ message }}</div>
    {% endfor %}
<a href="{{ url_for('login') }}">login</a>
</body>
</html>

6. 自定义上下文变量

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

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("自定义上下文变量.html")

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

if __name__ == '__main__':
    app.run(debug=True)

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

自定义上下文变量.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>{{ "appname: " + appname}}</p>
</body>
</html>

7.自定义上下文函数

原理和变量一样,只是返回的字典里,value是函数

from datetime import datetime

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("自定义上下文函数.html")

@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)

if __name__ == '__main__':
    app.run(debug=True)
自定义上下文函数.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p><p>{{ "当前时间: " + show_time()}}</p></p>
</body>
</html>