Flask-6-会话技术

一、cookie

客户端的会话技术。
cookie本身由浏览器保存,通过Response将cookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来

1.1 特点

  • 客户端会话技术,浏览器的会话技术

  • 数据全都是存储在客户端中

  • 存储使用的键值对结构进行的存储

  • 特性

  • 支持过期时间

    • 默认会自动携带本网站的所有cookie

    • 根据域名进行cookie存储

    • 不能跨域名

    • 不能跨浏览器

  • cookie是通过服务器创建的Response来创建的

1.2 设置cookie

response.set_cookie(key,value[,max_age=None,exprise=None])
  • max_age:整数,指定cookie过期时间整数,

  • expries:指定过期时间,可以指定一个具体日期时间

  • max_ageexpries两个选一个指定

1.3 获取cookie

request.cookies.get(key)

1.4 删除cookie

request.delete_cookie(key)

1.5 案例

一个通过cookie来实现登录的例子

首页模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>

<h1>首页</h1>
<hr>

{% if username %}
    当前登录人:{{ username }}
    <a href="/logout/">注销</a>
{% else %}

    <a href="/login/">登录</a>
{% endif %}
</body>
</html>

登录模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<h1>登录</h1>

<hr>
{#<form action="" method='post'>#}
{#<form action="/login/" method='post'>#}

<form action="{{url_for('user.login')}}" method='post'>
    <p>
        用户名:<input type="text" name="username">
    </p>
    <p>
        密码:<input type="password" name="password">
    </p>
    <p>
        <button>登录</button>
    </p>
</form>

</body>
</html>

后端代码

# 路由+ 视图函数

"""
在这里需要一个app,但是再次通过执行
from App import create_app
app = create_app()
来引入app就变得不太美好,这里使用flask的蓝图来解决
"""

import datetime

from flask import Blueprint, render_template, request, redirect

# 蓝图,蓝图可以有多个,可以根据不同的蓝图,管理不同的模块,然后不同模块使用不同的路由
blue = Blueprint('user', __name__)


# 这里的路由就是blue开头
@blue.route('/')
@blue.route('/home/')
def home():
    # 获取cookie
    username = request.cookies.get('user')

    return render_template('home.html', username=username)


@blue.route('/login/', methods=['GET', 'POST'])
def login():
    # 1. get 访问登录页面
    if request.method == 'GET':
        return render_template('login.html')

    elif request.method == 'POST':
        # 2. 丛前端得到提交的数据
        username = request.form.get('username')
        password = request.form.get('password')

        # 3. 模拟登录
        if username == 'python' and password == '123':
            # 重定向到home页面
            resp = redirect('/home/')

            # 设置cookie
            # cookie不能是中文
            # resp.set_cookie('user',username ) # 默认关闭浏览器就失效
            # 过期时间
            resp.set_cookie('user', username, expires=datetime.datetime(20231210))

            return resp

        else:
            return '用户名或密码错误'


#注销
@blue.route('/logout/')
def logout():
    resp = redirect('/home')

    # 4. 删除cookie
    resp.delete_cookie('user')

    return resp

运行情况

Flask-6-会话技术
image.png


登录成功后,可以在浏览器中看到cookie中的信息

Flask-6-会话技术
image.png

二、session

服务器端会话技术,依赖于cookie

2.1 特点

  • 服务端的会话技术

  • 所有数据存储在服务器中

  • 默认存储在内存中

  • 存储结构也是key-value形势,键值对

  • session 是离不开cookie的

Flask中的session是全局对象(之前的request也是Flask的一个全局对象)

2.2 设置session

session['key'] ='value

2.3 获取session

session.get(key,default=None#根据键获取会话的值

2.4 删除session

session.pop(key) #删除某一值
session.clear()#清除所有

2.5 案例

首页模板和登录模板不变,修改后端代码如下

后端代码

# 路由+ 视图函数

"""
在这里需要一个app,但是再次通过执行
from App import create_app
app = create_app()
来引入app就变得不太美好,这里使用flask的蓝图来解决
"""

import datetime

from flask import Blueprint, render_template, request, redirect, session

# 蓝图,蓝图可以有多个,可以根据不同的蓝图,管理不同的模块,然后不同模块使用不同的路由
blue = Blueprint('user', __name__)


# 这里的路由就是blue开头
@blue.route('/')
@blue.route('/home/')
def home():

    # 获取session
    username = session.get('user')

    return render_template('home.html', username=username)


@blue.route('/login/', methods=['GET', 'POST'])
def login():
    # 1. get 访问登录页面
    if request.method == 'GET':
        return render_template('login.html')

    elif request.method == 'POST':
        # 2. 丛前端得到提交的数据
        username = request.form.get('username')
        password = request.form.get('password')

        # 3. 模拟登录
        if username == 'python' and password == '123':
            # 重定向到home页面
            resp = redirect('/home/')

            # 设置session
            session['user'] = username

            return resp

        else:
            return '用户名或密码错误'


# 注销
@blue.route('/logout/')
def logout():
    resp = redirect('/home')

    # 删除session
    session.pop('user')

    return resp

需要配置下flask的配置

def create_app():
    app = Flask(__name__)
    # 注册蓝图
    app.register_blueprint(blueprint=blue)

    # 启动session时需要设置
    app.config['SECRET_KEY'] = 'DFSDFDSFDS'

    return app

关于Flask的配置

可以通过Flask的app.config得到当前的配置

<Config {
    'DEBUG'False
    'TESTING'False
    'PROPAGATE_EXCEPTIONS'None
    'SECRET_KEY'None
    'PERMANENT_SESSION_LIFETIME': datetime.timedelta(days=31), 
    'USE_X_SENDFILE'False
    'SERVER_NAME'None
    'APPLICATION_ROOT''/'
    'SESSION_COOKIE_NAME''session'
    'SESSION_COOKIE_DOMAIN'None
    'SESSION_COOKIE_PATH'None
    'SESSION_COOKIE_HTTPONLY'True
    'SESSION_COOKIE_SECURE'False
    'SESSION_COOKIE_SAMESITE'None
    'SESSION_REFRESH_EACH_REQUEST'True,
    'MAX_CONTENT_LENGTH'None
    'SEND_FILE_MAX_AGE_DEFAULT'None
    'TRAP_BAD_REQUEST_ERRORS'None
    'TRAP_HTTP_EXCEPTIONS'False
    'EXPLAIN_TEMPLATE_LOADING'False
    'PREFERRED_URL_SCHEME''http'
    'TEMPLATES_AUTO_RELOAD'None
    'MAX_COOKIE_SIZE'4093
    }>


原文始发于微信公众号(Python之家):Flask-6-会话技术

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198312.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!