1,content_processor
- 上下文处理器应该返回一个字典,字典中的
key
会被模板中当成变量来渲染 - 上下文处理器返回的字典,在所有页面中都是可以使用的
- 被这个装饰器修饰的钩子函数,必须要返回一个字典,即使为空也要返回
登陆的时候才会显示用户名。
from flask import Flask,render_template,g,url_for,request,redirect,session import os app = Flask(__name__) app.config['SECRET_KEY'] = os.urandom(24) @app.route('/') def hello_world(): # print("index") return 'index!' @app.route('/login/' ,methods=['GET','POST']) def login(): # print("login") if request.method == "GET": return render_template('login.html') else: username = request.form.get('username') password = request.form.get('password') if username == "1" and password == "1": session['username'] = "1" return 'Success to login in!' else: return redirect(url_for('login')) @app.route('/edit/') def edit(): ##1和 #2都是一样的意思,但是1更方便,hasattr() 函数用于判断对象是否包含对应的属性。 if hasattr(g,'username'): #1 # if session.get('username') == "1": #2 return render_template('edit.html') else: return redirect(url_for('login')) # before_request:在请求之前执行的,在视图函数执行之前执行的。 # before_request只是一个装饰器,他可把要设置为钩子函数的代码放到视图函数执行之前来执行。 @app.before_request def my_before_request(): print('hw') # 有username证明用户是登陆状态 if session.get('username'): g.username = session.get('username') #g? # 相当于在每一个视图函数(如‘/’,/login/执行前都会执行这个函数。) @app.context_processor def mycp(): return {"username":"1"} if __name__ == '__main__': app.run()