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)

posted @ 2022-04-22 00:48  翻滚的小强  阅读(40)  评论(0)    收藏  举报