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
。
<!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>
标签:__,index,20,render,flask,app,---,template,login From: https://www.cnblogs.com/joyware/p/17358104.html