flask_四、session、cookie简单应用+上下文
一、session简单示例(一):
前提:先setcookie一个值
from flask import Flask,make_response,redirect,url_for,request app=Flask(__name__) @app.route('/') # 两个都可以访问,直接访问时不带参数,故username为None @app.route('/hello') def hello(): username = request.args.get('username') print("username: %s" % username) if username is None: username = request.cookies.get('username','Human')#从cookie中获取username值,没有则返回‘Human’ return '<h1>Hello, %s</hi>' % username @app.route('/set/<name>') def set_cookie(name): #url_for()方法的第一个参数是视图函数名,第二个参数是该函数需要的参数 response = make_response(redirect(url_for('hello',username = '李白'))) #把url中name变量的值添加到cookie中name属性中 response.set_cookie('username',name) return response if __name__ == '__main__': app.run(debug = True)
运行结果:



二、session相关示例(二)
from flask import Flask, redirect, session, url_for,request app = Flask(__name__) import os # 对cookie进行加密 # 获取环境配置,在.env文件或.flask.env文件里找,找不到就取默认的#'secret string' app.secret_key = os.getenv('SECRET_KEY', 'secret string') @app.route('/login/') def login(): session['logged_in'] = True # 写入session return redirect(url_for('hello')) @app.route('/') @app.route('/hello') def hello(): print("app.secret_key: %s" % app.secret_key) name = request.args.get('name') if name is None: name = request.cookies.get('name', 'Human') # 从cookie中获取name值 return '<h1>Hello, %s</hi>' % name if __name__ == '__main__': app.run(debug=True)
运行结果


说明:session简单可理解为加密的cookie

2.1、设置环境变量(加密字段;secret_string1)



如果注释掉
# app.secret_key = os.getenv('SECRET_KEY', 'secret string')
访问直接报错

2.2、写入session的效果(一)
from flask import redirect, session, url_for, request,Flask app = Flask(__name__) import os app.secret_key = os.getenv('SECRET_KEY','secret string') @app.route('/login/') def login(): session['logged_in'] = True #写入session return redirect(url_for('hello')) @app.route('/') @app.route('/hello') def hello(): name = request.args.get('name') print("name: %s" % name) if name is None: name = request.cookies.get('name','flask')#从cookie中获取name值 response = '<h1>Hello, %s</h1>' % name #根据用户认证状态返回不同内容 print("session: %s" % session) print("type(session): %s" % type(session)) print("session.get('logged_in'): %s" % session.get('logged_in')) if 'logged_in' in session: response += '<p>[Authenticated]</p>' else: response += '[Not Authenticated]' return response if __name__ == '__main__': app.run(debug = True)
运行结果:


2.3、写入session的效果(二)
from flask import redirect, session, url_for, request,abort app = Flask(__name__) import os app.secret_key = os.getenv('SECRET_KEY','secret string') @app.route('/login') def login(): session['logged_in'] = True #写入session return redirect(url_for('hello')) @app.route('/admin') def admin(): if 'logged_in' not in session: abort(403) return 'welcom to admin page' @app.route('/') @app.route('/hello') def hello(): name = request.args.get('name') print("name: %s" % name) if name is None: name = request.cookies.get('name','flask')#从cookie中获取name值 response = '<h1>Hello, %s</h1>' % name #根据用户认证状态返回不同内容 print("session: %s" % session) print("type(session): %s" % type(session)) print("session.get('logged_in'): %s" % session.get('logged_in')) if 'logged_in' in session: response += '<p>[Authenticated]</p>' else: response += '[Not Authenticated]' return response if __name__ == '__main__': app.run(debug = True)
运行结果:


2.3.1、没有cookie的效果如下

三、设定ssesion有效期
@app.route('/login') def login(): session['zhigang'] = True # 写入session session.permanent = True # 设定session有效期为长期 return redirect(url_for('hello'))
运行效果

四、Flask的上下文


程序的:app.py
请求的:request

current_app使用时,需要导入包

from flask import g,request,Flask app = Flask(__name__) @app.before_request def get_username(): g.username = request.args.get('username') @app.route('/hello/') def hello(): print("g.username: %s" % g.username) print("g.get('username'): %s" % g.get('username')) return '<h1>Hello, %s</hi>' % g.username if __name__ == '__main__': app.run(debug = True)





五、重定向到原始url
from flask import request,redirect,url_for app = Flask(__name__) @app.route('/bar') def bar(): print("request.full_path: %s" % request.full_path) return '<h1>Bar page</h1><a href="%s">Do something </a>' % url_for('do_something') @app.route('/foo') def foo(): print("request.full_path: %s" % request.full_path) return '<h1>Foo page</h1><a href="%s">Do something </a>' % url_for('do_something') @app.route('/do_something') def do_something(): # do something return redirect(url_for('hello')) @app.route('/hello') def hello(): name = request.args.get('name') if name is None: name = request.cookies.get('name', 'gloryroad') # 从cookie中获取name值 response = '<h1>Hello, %s</h1>' % name return response if __name__ == '__main__': app.run(debug = True)
六、修改do_something视图函数:request.referrer
@app.route('/do_something') def do_something(): # do something return redirect(request.referrer)
点击do something的页面跳转

原来的访问路径

七、使用next参数
from flask import request,redirect,url_for app = Flask(__name__) @app.route('/bar') def bar(): print("request.full_path: %s" % request.full_path) return '<h1>Bar page</h1><a href="%s">Do something </a>' % url_for('do_something', next=request.full_path) @app.route('/foo') def foo(): print("request.full_path: %s" % request.full_path) return '<h1>Foo page</h1><a href="%s">Do something </a>' % url_for('do_something', next=request.full_path) @app.route('/do_something') def do_something(): return redirect(request.args.get('next')) @app.route('/hello') def hello(): name = request.args.get('name') if name is None: name = request.cookies.get('name', 'gloryroad') # 从cookie中获取name值 response = '<h1>Hello, %s</h1>' % name return response if __name__ == '__main__': app.run(debug = True)


浙公网安备 33010602011771号